0

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

这是安全配置。这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();

但是/app/logout即使没有经过身份验证的用户也可以访问这种方式!有人知道更好的解决方案吗?

4

1 回答 1

1

只需从中删除注销路径access_control。如果未经过身份验证的用户进入注销页面,则不会发生任何不好的事情——这是安全的。不要过度设计这些东西。;)

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

于 2012-07-25T04:34:55.633 回答