Symfony2实体用户提供程序覆盖自定义身份验证提供程序


Symfony2 entity user provider overrides custom auth provider

My Symfony2自定义身份验证提供程序现在似乎正在工作。

用户提供商

我几乎使用了FOSUserBundle,但我甚至没有用户的电子邮件地址,我不需要添加功能或复杂性。

所以我只是使用实体提供程序。

我将编码器设置为纯文本,因为API客户端库为我处理这一问题,但遗憾的是,还有另一个障碍:似乎用户现在正在根据这些用户记录进行身份验证

在我实现实体用户提供程序之前,我的登录表单给了我有效的响应:正确的凭据不会产生错误,错误的凭据会导致我自定义的"不正确的用户/通行证错误"。

现在,即使我提供了我知道是正确的凭据,我得到的只是错误消息"Bad credentials",就好像我在实现UserAuthenticationProvider一样,但据我所知,我不是。我的自定义提供程序直接实现AuthenticationProviderInterface。

因此,目前我认为我错误地实现了实体用户提供程序,因此它以某种方式覆盖了我的自定义身份验证提供程序。同时配置实体用户提供程序和自定义身份验证提供程序的正确方法是什么?

文件

  • /app/config/security.yml
  • /src/WordRot/PlayBundle/Security/Authentication/Provider/WordnikProvider.php

安全性的相关部分。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

编辑

这可能证明是有用的。这是主分支的差异。。。

  • From当自定义身份验证提供程序(WordnikProvider)仍在执行时(a473d354)
  • 主分支(ddcfeae2)上的最新提交,其中不再执行身份验证提供程序

编辑2

我发现了更多的断点:

  1. 在登录表单POST中,使用UsernamePasswordToken调用WordnikProvider#supports,从而返回false
  2. 在登录表单POST上,构造了WordnikListener,但从未调用它的其他方法(attemptAuthenticationrequiresAuthentication)。然而,WordnikFactory#createListener也从未被调用!令人惊奇的是,听众是天生的
  3. 但是,在login_check GET上,调用了WordnikListener#requiresAuthentication

所以我们对此进行了长时间的讨论。基本问题是form_login服务干扰了wodnik服务。删除了form_login,情况开始好转。

https://chat.stackoverflow.com/rooms/25251/discussion-between-montgomery-jean-and-cerad