我想在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();
}