在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