2012-07-25 58 views
0

我想解决我的Symfony 2应用程序中的这种不一致性:当用户是而不是经过验证的路径/app/logout重定向到/app/login。相反,未通过身份验证的用户应查看错误页面(可能为403)。注销路由中的Symfony 2不一致:注销重定向到登录?

以下是安全配置。该IS_AUTHENTICATED_FULLY似乎强制性的,作为一个用户可以做注销只有当它以前完全认证:

access_control: 
    - { path: ^/app/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/app/logout, roles: IS_AUTHENTICATED_FULLY } 

而且我AccessController的注销操作:

/** 
* @Extra\Route("logout") 
* @Extra\Template 
*/ 
public function logoutAction() 
{ 
    // Set the token to null and invalidate the session 
    $this->getSecurityContext()->setToken(null); 
    $this->getSession()->invalidate(); 

    // Redirect url and seconds (window.location) 
    $seconds = 5; 
    $redirect = $this->getRouter()->generate('access_login'); 

    return array('seconds' => $seconds, 'redirect' => $redirect); 
} 

一个解决办法是从接入移除路线/app/logout控件,然后抛出一个异常,如果用户它不是完全认证:

if(false === $this->getSecurityContext()->isGranted('IS_AUTHENTICATED_FULLY')) 
    throw new AccessDeniedException(); 

但是这样一来即使没有经过身份验证的用户也可以访问!有人知道更好的解决方案

回答

1

只需从access_control删除注销路径即可。如果没有经过身份验证的用户转到注销页面,将会发生什么不良 - 这是安全的。不要滥用这些东西。 ;)

顺便说一句,为什么你不使用Symfony的内置注销控制器?您可以创建一个注销处理程序来将自定义代码放入其中,而不是通过自己处理所有注销内容来重新发明轮子。

+0

使用注销处理程序而不是自定义控制器操作会有什么区别? – gremo 2012-07-25 10:09:46

+1

这对Symfony来说更具有惯性。解决问题时使用内置解决方案;只有在没有可用的满意解决方案时才使用您的自定义代码。如果在未来版本的Symfony中注销逻辑发生变化会怎样?你必须注意并更新你的代码。如果你使用内置的东西,你不必打扰。 – 2012-07-25 10:58:49