簡體   English   中英

我可以使用Sytrfony 4上的Doctrine(findOneBy())通過用戶名和密碼獲取用戶嗎?

[英]Can I get a user by their username and password using Doctrine (findOneBy()) on Symfony 4?

我希望在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);

執行此操作的正確方法是通過用戶名獲取用戶,然后使用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; 腳本頂部的語句。

從技術上講,如果您知道用戶名和密碼(哈希),就可以找到用戶。

但是,由於散列通常使用隨機鹽,因此無法通過用戶名和純文本密碼找到用戶。

這里干凈的方法是通過用戶名獲取用戶並檢查密碼(通過password_verifysymfony版本 (或參見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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM