【问题标题】:Can I get a user by their username and password using Doctrine (findOneBy()) on Symfony 4?我可以在 Symfony 4 上使用 Doctrine (findOneBy()) 通过用户名和密码获取用户吗?
【发布时间】:2019-08-19 13:51:07
【问题描述】:

我想在 Symfony4 上使用 Doctrine(findOneBy() 方法)通过用户名和密码获取用户。

security:
    encoders:
        App\Entity\User:
        algorithm: argon2i
$username= $request->request->get('username');
$password = $request->request->get('password');
$user= $this->em->getRepository(User::class)->findOneBy([
    'username'=>$username,
    'passsword'=>$password
]);
return  new Response($user);

【问题讨论】:

  • youseef,请记住,如果它解决了您的问题,您可以接受答案

标签: php symfony authentication doctrine-orm doctrine


【解决方案1】:

正确的做法是通过用户名获取用户,然后使用 Symfony 的密码编码器验证密码。

例如:

public function __construct(UserPasswordEncoderInterface $encoder) {
    $this->encoder = $encoder;
}

public function yourAction(Request $request) {
    $username = $request->request->get('username');
    $password = $request->request->get('password');
    $user     = $this->em->getRepository(User::class)->findOneBy(['username'=>$username]);

    if ($user === null) {
        // user not found
        // throw exception or return error or however you handle it
    }

    if (! $this->encoder->isPasswordValid($user, $password)) {
        // invalid password
        // throw exception, or return error, or however you handle it
    }

//...
}

请记住,您需要在脚本顶部添加 use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; 语句,否则您将收到“找不到类”错误。

【讨论】:

    【解决方案2】:

    从技术上讲,如果您知道用户名和密码(哈希),就可以找到用户。

    但是,由于哈希通常使用随机盐进行加盐,因此您无法通过用户名和纯文本密码找到用户。

    这里的干净方法是通过用户名获取用户并检查密码(通过password_verifythe symfony version(或参见yivi's answer))。

    【讨论】:

      【解决方案3】:

      我认为要通过多个条件,您必须使用“findBy”方法

      $username= $request->request->get('username');
      $password = $request->request->get('password');
      $user= $this->em->getRepository(User::class)->findBy(
                   [
                     'username' => $username,
                     'password'=> $password
                   ],
                   [], 
                   1
      );
      return  new Response($user);
      

      You can find detail explanation of doctrine methods here

      【讨论】:

      • Rehan,正如在其他地方解释的那样,您无法通过密码搜索用户名。这个建议是错误的。祝你好运!
      【解决方案4】:

      您可以在存储库中创建一个新方法 (App/Repository/UserRepository.php) 您也可以在其中提供用户名和密码并将结果发回。

      public function getUserByUsernameAndPassword(string $username, string $password)
      {
          $qb = $this->createQueryBuilder('u')
            ->andWhere('u.username = :username')
            ->andWhere('u.password LIKE :password')
            ->setParameter('username',  $username )
            ->setParameter('password',  $password )
            ->getQuery();
      
          return $qb->getResult();
      }
      

      【讨论】:

      • 恐怕这是完全错误的。密码不会以纯文本形式保存在数据库中,因此无法查询它们。
      • @yivi 这取决于您在存储库中如何调用此函数。如果您在控制器中散列密码,这将正常工作。
      • 不,蝰蛇。如果您使用password_hash()password_verify()您应该这样做),您创建的哈希将包含一个随机盐,并且与您在数据库中的内容不匹配。 This is very easily demonstrated.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 2015-05-06
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多