カスタム ユーザー プロバイダーの作成に関する Symfony クックブックに従っていますが、ユーザー パスワードを検証する方法がわかりません。これはユーザー プロバイダーの仕事ですか? または、これは別の方法で発生するはずですか?彼がフォームから送信したパスワードがデータベースのパスワードと同じであることを確認するにはどうすればよいですか?
1 に答える
ユーザー プロバイダーは、認証を処理するものではありません。それが認証プロバイダーの役割です。
次の記事「カスタム認証プロバイダーを作成する方法」を参照して、アイデアを得てください。
Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider も参照してください。そのコンストラクターが userProvider のインスタンスを受け取り、それを retrieveUser() で使用して DB からユーザーのデータを取得する方法をご覧ください。また、DaoAuthenticationProvider である UserAuthenticationProvider 抽象クラスでは、このデータは checkAuthentication() メソッド (DaoAuthenticationProvider によって実装) に渡されます。そこで、User クラスに関連付けられたエンコーダーを使用して、最初に UsernamePasswordToken から取得した UserInterface インスタンスのパスワードをエンコードし、データベースから取得した既にエンコードされたバージョンと比較します。
編集:あなたのコメントについて:私はこれに似たようなことを少し前に行いました(非常に非標準の認証マネージャー(:)を使用した標準フォームのログインのみを使用しましたが、残念ながら実装をよく覚えていません。覚えていることSymfony2 のソース コードをたくさん読まなければならなかったということです... カスタムの AuthenticationProvider の実装から始めてみることもできます. UserAuthenticationProvider 抽象クラスに基づいて DaoAuthenticationProvider を一種の参照として使用することもできます.つまり、ユーザー プロバイダーを使用して関連データを取得するように retrieveUser() を実装できます。取得したユーザーのデータを利用するような方法で checkAuthentication() メソッドを実装します。次に、ユーザーの資格情報が何らかの方法でエンコードされている場合は、カスタム ユーザー クラスの secruty.encoders 構成で適切なエンコーダーを指定する必要があると思います。ああ、認証プロバイダ ファクトリとカスタム セキュリティ トークンについても忘れないでください。
私が提供したいくつかの情報が間違っていたことを本当に申し訳ありません。ただ、今は自分の実装が目の前にないというだけです (率直に言って、今は Symfony 2 のコードをもう一度掘り下げるのが面倒です)。
別の編集:構成部分について。繰り返しますが、正しく覚えているかどうかはわかりませんが、構成でカスタム認証プロバイダーのファクトリを指定する必要があると思います。次に、キー (ファクトリの getKey() メソッドで指定したもの) をファイアウォールの構成に含めることができるようになり、これにより、このファイアウォールのカスタム認証プロバイダーが有効になります。