Php 我可以使用Symfony 4上的条令(findOneBy())通过用户名和密码获取用户吗?

Php 我可以使用Symfony 4上的条令(findOneBy())通过用户名和密码获取用户吗?,php,symfony,authentication,doctrine-orm,doctrine,Php,Symfony,Authentication,Doctrine Orm,Doctrine,我想在Symfony4上使用条令(findOneBy()method)通过用户名和密码获取用户 security: encoders: App\Entity\User: algorithm: argon2i $username=$request->request->get('username'); $password=$request->request->get('password'); $user=$this->em->getRepository(us

我想在Symfony4上使用条令(
findOneBy()
method)通过用户名和密码获取用户

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,
“密码剑”=>$password
]);
返回新的响应($user);

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

但是,由于散列通常是用随机盐腌制的,所以您无法通过用户名和纯文本密码找到用户


这里的干净方法是通过用户名获取用户并检查密码(通过或(或参见))

您可以在存储库中创建一个新方法(App/repository/UserRepository.php) 在这里,您还可以提供用户名和密码,并返回结果

公共函数getUserByUserName和password(字符串$username,字符串$password)
{
$qb=$this->createQueryBuilder('u')
->andWhere('u.username=:username')
->andWhere('u.password-LIKE:password')
->setParameter('username',$username)
->setParameter('password',$password)
->getQuery();
返回$qb->getResult();
}

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

例如:

public function\uuu构造(userpasswordencoderface$encoder){
$this->encoder=$encoder;
}
公共职能部门行动(请求$Request){
$username=$request->request->get('username');
$password=$request->request->get('password');
$user=$this->em->getRepository(user::class)->findOneBy(['username'=>$username]);
如果($user==null){
//找不到用户
//抛出异常或返回错误,或以何种方式处理
}
如果(!$this->encoder->isPasswordValid($user,$password)){
//无效密码
//抛出异常,或返回错误,或以何种方式处理
}
//...
}

请记住,您需要添加
使用Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface语句,否则将出现“未找到类”错误。

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


恐怕这是完全错误的。密码不会以明文形式保存在数据库中,因此查询密码将不起作用。@yivi这取决于您如何在存储库中调用此函数。如果你在控制器中散列你的密码,这将很好。不,Viperium。如果您使用的是
password\u hash()
password\u verify()
(您应该这样做),那么您创建的hash将包含一个随机salt,并且与数据库中的内容不匹配。Rehan,正如其他地方所解释的,你不能用密码搜索用户名。这个建议是错误的。祝你好运youseef,记住,如果答案解决了你的问题,你可以接受
$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);