我可以在Symfony 4上使用Doctrine(findOneBy())通过用户名和密码获取用户吗?



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

security:
encoders:
AppEntityUser:
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);

正确的方法是通过用户名获取用户,然后使用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 SymfonyComponentSecurityCoreEncoderUserPasswordEncoderInterface;语句,否则会收到"找不到类"错误。

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

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

这里的干净方法是通过用户名获取用户并检查密码(通过password_verify或symfony版本(或查看yivi的答案((。

我认为要通过多个条件,您必须使用"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);

你可以在这里找到教义方法的详细解释

您可以在存储库中创建一个新方法 (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();
}

相关内容

  • 没有找到相关文章

最新更新