【问题标题】:symfony logout target never appliedsymfony 注销目标从未应用
【发布时间】:2015-12-30 09:10:48
【问题描述】:

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

好的,我正在使用:

  • 基于表单的登录
  • 挂钩的自定义失败、成功和注销处理程序,它们运行良好

我的 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 }

我正在为路径使用路由名称,该路由存在并且工作正常(我可以 loginlogin_checklogout )。

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

我会很高兴,如果有人能指出我正确的方向,如何退出自定义路线(我也尝试过 target 与路线名称)。非常感谢!

顺便说一句:

我的 logout_success_handler 目前什么都不做。通过启用转储,我还看到,重定向始终是 / 而不是 /test。

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

    //var_dump($response); die;

    return $response;
}

【问题讨论】:

    标签: php symfony authentication logout


    【解决方案1】:

    对于有同样问题的人来说,最后的方法。

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

    【讨论】:

      【解决方案2】:

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

      第 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);
      }
      

      【讨论】:

      • 这很完美!但是有人需要更新SecurityBundle Configuration。这会误导我使用 logout.target
      • 这也和这个问题很相似stackoverflow.com/questions/21835509/…>.
      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2017-05-02
      • 2018-06-04
      • 2013-08-19
      • 2021-11-23
      • 2021-10-21
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多