我的 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 上,使用 UsernamePasswordToken 调用WordnikProvider#supports,从而返回
false
. - 在登录表单 POST 上,
WordnikListener
已构造但它的其他方法 (attemptAuthentication
,requiresAuthentication
) 从未被调用。然而WordnikFactory#createListener
,也从未被调用!构造监听器是一个奇迹。 - 然而,在
login_check
GET 上,WordnikListener#requiresAuthentication
被调用。