首页 文章

FOSUserBundle:根据电子邮件密码和第三个字段对用户进行身份验证

提问于
浏览
0

如何覆盖FOSUserBundle,以便我可以根据以下组合注册/验证用户:

Email ID + Password + GroupID 而不仅仅是 email + password

因此,电子邮件将不再是唯一的,但 email + groupid 的组合将使用户唯一(每组)并且可以拥有独立的密码 .

我正在使用 FOSUserBundle v2.0.2Symfony 3.4.x

具有有效登录ID的fos_user表行示例:

ID| EMAIL          | GROUP | PASSWORD
--+----------------+-------+---------
1 | u1@example.com |   10  | xxxxxxxx
2 | u1@example.com |   11  | xxxxxxxx
3 | u2@example.com |   10  | xxxxxxxx
4 | u2@example.com |   13  | xxxxxxxx
5 | u1@example.com |   12  | xxxxxxxx

2 回答

  • 0

    使用Symfony Guard创建基于表单的检查和登录将不会太难 .

    这是一些必需的基本课程 . 将它连接到用户安全性显示在Symfony帮助页面上,还有其他关于使用它的博客文章 .

    <?php
    namespace App\Security;
    
    use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
    // other classes to be used
    
    class UserGroupAuthenticator extends AbstractGuardAuthenticator
    {
        // other required methods, see the examples
    
        // this guard is only supported if there is a 'group' form field
        public function supports(Request $request)
        {
            return $request->get->get('group');
        }
    
        public function getCredentials(Request $request)
        {
            return array(
                'email' => $request->get->get('email'),
                'group' => $request->get->get('group'),
                'password' => $request->get->get('password'),
            );
        }
    
        public function getUser($credentials, UserProviderInterface $userProvider)
        {
            $email = $credentials['email'];
            $group = $credentials['group'];
    
            // if a User object, checkCredentials() is called
            return $userProvider->loadUserByEmailsAndGroup($email, $group);
        }
    
        public function checkCredentials($credentials, UserInterface $user)
        {
            // check credentials - e.g. make sure the password is valid
            // ....
    
            // return true to cause authentication success
            return true;
        }
    }
    
  • 0

    我不希望用户能够选择他们的组,而是由系统内部管理 . 对于注册,与FOS完成的工作并不多 . 我所需要的只是使用一组新的学说键约束来覆盖User实体 . 我在扩展BaseUser的User实体中添加了以下内容:

    /**
     * User.
     *
     * @ORM\Table(name="fos_user",
     *     uniqueConstraints={
     *          @UniqueConstraint(name="group_username_unique", columns={"group_id", "username_canonical"}),
     *          @UniqueConstraint(name="group_email_unique", columns={"group_id", "email_canonical"})
     *      }
     * )
     * @UniqueEntity(fields={"group", "usernameCanonical"}, errorPath="username", message="fos_user.username.already_used")
     * @UniqueEntity(fields={"group", "emailCanonical"}, errorPath="email", message="fos_user.email.already_used")
     * @ORM\Entity
     * @ORM\AttributeOverrides({
     *     @ORM\AttributeOverride(name="emailCanonical", column=@ORM\Column(type="string", length=180, nullable=false, unique=false)),
     *     @ORM\AttributeOverride(name="usernameCanonical",column=@ORM\Column(type="string", length=180, nullable=false, unique=false))
     * })
     */
    class User extends BaseUser
    {
        /* my entity contents here */
    }
    

    登录时,这是一个很大的工作 . 我必须覆盖UserProvider,UserManager,创建CustomUserManager并添加一组具有Group约束的新方法:

    public function findUserByUsernameOrEmailAndGroup($usernameOrEmail, $group)
    {
        if (preg_match('/^.+\@\S+\.\S+$/', $usernameOrEmail)) {
            return $this->findUserByEmailAndGroup($usernameOrEmail, $group);
        }
    
        return $this->findUserByUsernameAndGroup($usernameOrEmail, $group);
    }
    
    public function findUserByEmailAndGroup($email, $group)
    {
        return $this->findUserBy(['group' => $group, 'emailCanonical' => $email]);
    }
    
    public function findUserByUsernameAndGroup($username, $group)
    {
        return $this->findUserBy(['group' => $group, 'usernameCanonical' => $username]);
    }
    
    public function findUserByConfirmationTokenAndGroup($token, $group)
    {
        return $this->findUserBy(['confirmationToken' => $token, 'group' => $group]);
    }
    

    此外,我在RegistrationController和ResettingController上进行了覆盖,以采用新的登录和密码重置功能更改 .

相关问题