在Symfony2中,身份验证失败

我在验证工作时遇到问题,但只能在非常特殊的情况下发生。 身份验证是通过第三方API完成的,因此我编写了自己的用户提供程序类,并且在该类内部有一些可以在API和Symfony之间同步数据的代码,作为同步过程的一部分,它确定用户应具有哪些角色。 这样做后,它通过ManyToMany关系建立角色和用户之间的关系。

我的User对象中的getRoles()方法将角色对象从数据库中取出并将其转换为一个字符串数组,角色名称来自我的数据库,并且都以ROLE_开头。

如果我使用不应具有额外角色的帐户登录,那么它可以正常工作,但如果我登录到应具有角色的帐户,那么我只会将其发送回登录屏幕,而不会显示任何错误消息。

我检查了日志并看到了这些条目:

security.INFO: User "test105@example.com" has been authenticated successfully [] []
event.DEBUG: Notified event "security.interactive_login" to listener "PogoMyBundleListenerLoginListener::onSecurityInteractivelogin". [] []
event.DEBUG: Listener "SymfonyComponentSecurityHttpFirewall::onKernelRequest" stopped propagation of the event "kernel.request". [] []
event.DEBUG: Listener "SymfonyBundleFrameworkBundleEventListenerRouterListener" was not called for event "kernel.request". [] []
event.DEBUG: Listener "SymfonyBundleAsseticBundleEventListenerRequestListener" was not called for event "kernel.request". [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyComponentSecurityHttpFirewallContextListener::onKernelResponse". [] []
security.DEBUG: Write SecurityContext in the session [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyComponentHttpKernelEventListenerResponseListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyBundleSecurityBundleEventListenerResponseListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyBridgeMonologHandlerFirePHPHandler::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "SensioBundleFrameworkExtraBundleEventListenerCacheListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyComponentHttpKernelEventListenerProfilerListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "SymfonyBundleWebProfilerBundleEventListenerWebDebugToolbarListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.request" to listener "SymfonyBundleFrameworkBundleEventListenerRouterListener::onEarlyKernelRequest". [] []
event.DEBUG: Notified event "kernel.request" to listener "SymfonyBundleFrameworkBundleEventListenerSessionListener::onKernelRequest". [] []
event.DEBUG: Notified event "kernel.request" to listener "SymfonyComponentSecurityHttpFirewall::onKernelRequest". [] []
security.INFO: Populated SecurityContext with an anonymous Token [] []
event.DEBUG: Notified event "kernel.exception" to listener "SymfonyComponentSecurityHttpFirewallExceptionListener::onKernelException". [] []
security.DEBUG: Access denied (user is not fully authenticated); redirecting to authentication entry point [] []
security.DEBUG: Calling Authentication entry point [] []

我不明白它是如何在顶层进行身份验证的,那么只要它检查防火墙,它就会发现自己有一个匿名令牌,这就是为什么它可能会将我发回到登录屏幕。

我的防火墙/ access_control设置是:

firewalls:
    public:
        pattern: /.*
        anonymous: true
        tessitura_login:
            login_path: /account/login
            check_path: /secure/login_check
        logout:
            path: /secure/logout
            target: /
access_control:
    - { path: ^/secure/.*, role: ROLE_USER }
    - { path: ^/admin.*, role: ROLE_ADMIN }
    - { path: ^/account/login/?, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }

任何与此有关的帮助将得到大量赞赏,我已经花了几个小时对此进行研究,并且完全陷入困境。


当使用电话号码作为用户名并且没有在refreshUser()方法中指定用户名属性时,得到了这个无声失败问题,该方法应该是:

public function refreshUser(UserInterface $customer)
{
    $class = get_class($customer);

    if( !$this->supportsClass($class) ) {
        throw new UnsupportedUserException("Instances of "{$class}" are not supported");
    }

    return $this->loadUserByUsername($customer->getPhoneNumber()); // <-- This is it!
}

我认为我不是唯一错过它的人,可能会有所帮助。


一个破坏的会话存储引起了我的这个问题 我正在使用PdoSessionHandler,令人失望的是它没有给出明确的错误或日志消息。


我也经历过同样的事情。 当我的用户登录时,我检查了几个像这样的语句:

if(true === $this->get('security.context')->isGranted('ROLE_MANAGER')){
   //return redirect
}
if(true === $this->get('security.context')->isGranted('ROLE_USER')){
   //return redirect
}
//throw error

时不时的一些用户得到一个错误抛出他们的脸。 我想这是因为同样的原因。 用户不知何故被认证,但没有得到他们的角色。

我无法重现我自己的问题。 我刚刚听到来自用户的错误报告。

链接地址: http://www.djcxy.com/p/9141.html

上一篇: Authentication fails silently in Symfony2

下一篇: Create Facebook applications for a company without a personal profile