symfony注销目标从未应用

时间:2015-10-02 07:28:25

标签: php symfony authentication logout

我第一次遇到Symfony(2.7)身份验证问题,我真的找不到可行的解决方案。虽然Symfony有一个专用的配置选项 logout - > target ,这从未在注销时应用,我总是被定向到/。我可能错过了正确实现这一点的一些限制。

好的,我正在使用:

  • 基于表单的登录
  • Hooked自定义失败,成功和注销处理程序,它们正常运行

我的config.yml防火墙

secured_area:
        pattern:    ^/
        stateless:  false
        form_login:
            ...
        logout:
            path:   logout
            target: /test
            success_handler: logout_success_handler
        anonymous: ~

为了测试,我甚至添加了

access_control:
    - { path: ^/test, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/,     roles: IS_AUTHENTICATED_ANONYMOUSLY }

我使用路径的路由名称,路由存在且工作正常(我可以登录 login_check 注销)。

我希望通过设置注销 - > target ,注销时我会被重定向到页面/测试。但无论我尝试过什么,直到现在我总是在退出时/之后。

我会很高兴,如果有人可以指出我正确的方向,如何退出自定义路线(我也尝试使用路线名称​​目标)。非常感谢!

顺便说一句:

我的logout_success_handler目前没有任何功能。通过启用转储,我也看到,重定向始终是/而不是/ test。

public function onLogoutSuccess(Request $request)
{
    $response = parent::onLogoutSuccess($request);

    //var_dump($response); die;

    return $response;
}

2 个答案:

答案 0 :(得分:1)

没有内置的退出目标。你必须在你的处理程序中处理它。

第1步

将您的退出目标放入参数文件

parameters:
    logout.target: /test

第2步

将您已注销处理程序的service.yml修改为以下内容:

some.logout_handler:
    class: SomeBundle\Security\YourAuthenticationHandler
    arguments: ["@security.context", %logout.target%]

这会将它注入你的处理程序。

第3步

最后,在您的onLogoutSuccess方法中,只需执行

public function onLogoutSuccess(Request $request)
{
    $response = parent::onLogoutSuccess($request);

    return new RedirectResponse($this->logoutTarget);
}

答案 1 :(得分:0)

这是人们遇到同样问题的最终方法。

/**
 * LogoutSuccessHandler
 */
class LogoutSuccessHandler extends DefaultLogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
    /**
     * @var string
     */
    private $logout_route;

    /**
     * Constructor
     * 
     * @param RouterInterface $router
     * @param EntityManager $em
     */
    public function __construct(HttpUtils $httpUtils, $logoutRoute)
    {
        $this->logout_route = $logoutRoute;

        parent::__construct( $httpUtils );
    }

    /**
     * @param Request $request
     * @return Response
     */
    public function onLogoutSuccess(Request $request)
    {
        return $this->httpUtils->createRedirectResponse($request, $this->logout_route);
    }
}

我想使用 httpUtils ,因为 createRedirectResponse 了解路径和路由名称。