Php 从未应用symfony注销目标

Php 从未应用symfony注销目标,php,symfony,authentication,logout,Php,Symfony,Authentication,Logout,我第一次遇到Symfony(2.7)身份验证的问题,我真的找不到有效的解决方案。虽然Symfony有一个专用的配置选项logout->target,但它从来不会应用于注销,我总是被引导到/。我可能错过了正确实现这一点的一些限制 好的,我正在使用: 基于表单的登录 钩住自定义失败、成功和注销处理程序,这些处理程序工作正常 My config.yml防火墙 secured_area: pattern: ^/ stateless: false

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

好的,我正在使用:

  • 基于表单的登录
  • 钩住自定义失败、成功和注销处理程序,这些处理程序工作正常
My 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 }
我正在为路径使用路由名称,路由存在并且工作正常(我可以登录、登录\检查和注销)

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

我会很高兴,如果有人能告诉我正确的方向,如何注销到自定义路由(我也尝试了使用路由名称的target)。非常感谢

顺便说一句:

我的注销\u成功\u处理程序当前不执行任何操作。通过启用转储,我还看到重定向总是要进行/而不是进行/测试

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

    //var_dump($response); die;

    return $response;
}

没有内置的注销目标。你必须在你的处理器中处理它

步骤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);
}

以及对有同样问题的人的最终方法

/**
 * 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可以理解路径和路由名称。

这很好用!但是有人需要更新一下。这误导了我使用logout.target。这与这个问题非常相似。