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();
但是这样一来即使没有经过身份验证的用户也可以访问!有人知道更好的解决方案
使用注销处理程序而不是自定义控制器操作会有什么区别? – gremo 2012-07-25 10:09:46
这对Symfony来说更具有惯性。解决问题时使用内置解决方案;只有在没有可用的满意解决方案时才使用您的自定义代码。如果在未来版本的Symfony中注销逻辑发生变化会怎样?你必须注意并更新你的代码。如果你使用内置的东西,你不必打扰。 – 2012-07-25 10:58:49