私のSymfony2カスタム認証プロバイダーは現在機能しているようです。
ユーザープロバイダー
私はほとんどFOSUserBundleを使用しましたが、ユーザーの電子メールアドレスすら持っておらず、追加の機能や複雑さも必要ありません。
代わりに、エンティティプロバイダーを使用しています。
APIクライアントライブラリがそれを処理するため、エンコーダーをプレーンテキストに設定しましたが、残念ながら、別の問題があります。ユーザーはこれらのユーザーレコードに対して認証されているようです。
エンティティユーザープロバイダーを実装する前に、ログインフォームから有効な応答が返されました。正しいクレデンシャルではエラーは発生せず、不正なクレデンシャルではカスタムの「不正なユーザー/パスエラー」が発生しました。
これで、正しいことがわかっているクレデンシャルを指定しても、UserAuthenticationProviderを実装しているかのように、「不正なクレデンシャル」というエラーメッセージが表示されるだけですが、私の知る限りでは、そうではありません。私のカスタムプロバイダーは、AuthenticationProviderInterfaceを直接実装しています。
そのため、現時点では、エンティティユーザープロバイダーを誤って実装しているため、カスタム認証プロバイダーが何らかの形でオーバーライドされていると思います。エンティティユーザープロバイダーとカスタム認証プロバイダーを同時に構成する正しい方法は何ですか?
ファイル
- /app/config/security.yml
- /src/WordRot/PlayBundle/Security/Authentication/Provider/WordnikProvider.php
security.ymlの関連セクション
encoders:
WordRot\PlayBundle\Entity\User: plaintext
providers:
wordnik_users:
entity: { class: WordRotPlayBundle:User, property: username }
firewalls:
wordnik_secured:
pattern: ^/play
logout: ~
anonymous: ~
# The next line specifies the custom authentication provider:
wordnik: true
form_login:
provider: wordnik_users
login_path: /login
check_path: /play_check
# on success
always_use_default_target_path: true
default_target_path: /play
編集
これは役に立つかもしれません。マスターブランチの差分です...
- カスタム認証プロバイダー(WordnikProvider)がまだ実行されたときから(a473d354)
- マスターブランチ( ddcfeae2)での最新のコミットに対して、認証プロバイダーは実行されなくなります。
編集2
私が発見したより多くのブレークポイントで:
- ログインフォームPOSTで、WordnikProvider#supportsがUsernamePasswordTokenで呼び出されているため、が返され
false
ます。 - ログインフォームPOSTで、
WordnikListener
が作成されますが、他のメソッド(attemptAuthentication
、requiresAuthentication
)は呼び出されません。それでもWordnikFactory#createListener
、また、決して呼ばれることはありません!リスナーが構築されているのは不思議です。 - ただし、
login_check
GETでは、WordnikListener#requiresAuthentication
ISが呼び出されます。