代码之家  ›  专栏  ›  技术社区  ›  n00n

重定向窗体LogoutListener

  •  0
  • n00n  · 技术社区  · 6 年前

    我正在学习Symfony,在我的示例项目中,我有一个注销侦听器来观察注销。

    class LogoutListener implements LogoutHandlerInterface {
    
        protected $userManager;
    
        public function logout(Request $request, Response $response, TokenInterface $token) {
            $request->getSession()->invalidate();
            $this->  ....?
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   kalehmann ASKN    6 年前

    LogoutHandlerInterface 不是为在注销后修改行为而设计的。

    看一看这个 LogoutSuccessHandlerInterface 相反,尤其是 onLogoutSuccess 方法。

    使用此方法可自定义注销行为并返回 RedirectResponse .

    例如:

    class LogoutListener implements LogoutSuccessHandlerInterface 
    {
        public function onLogoutSuccess(Request $request): Response
        {
            $request->getSession()->invalidate();
    
            return new RedirectResponse('http://mycoolsite.com');
        }
    }
    

    或者更好地使用 generate method

    class LogoutListener implements LogoutSuccessHandlerInterface 
    {
        protected $router;
    
        public function __construct(RouterInterface $router)
        {
            $this->router = $router;
        }
    
        public function onLogoutSuccess(Request $request): Response
        {
            $request->getSession()->invalidate();
    
            return new RedirectResponse(
                $this->router->generate(
                    'myroute',
                    [],
                    UrlGeneratorInterface::ABSOLUTE_PATH
                )
            );
        }
    }
    
        2
  •  1
  •   kalehmann ASKN    6 年前

    对不起,我迟了回信,但我有一阵子又病又忙。

    我试过你的例子,我喜欢,似乎是一个更好的方式。

    在my security.yaml中,我配置了以下内容:

    firewalls:
            main:
                pattern: ^/
                form_login:
                    provider: fos_userbundle
                    csrf_token_generator: security.csrf.token_manager
                    default_target_path: /welcome
                logout:
                    handlers: [App\Listeners\LogoutListener]
                anonymous:    true
    
        access_control:
            - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin/, role: ROLE_ADMIN }
    

    我的例外:

    传递给Symfony\Component\Security\Http\Firewall\LogoutListener::addHandler()的参数1必须实现接口Symfony\Component\Security\Http\Logout\LogoutHandlerInterface,给定App\Listeners\LogoutListener的实例,在第30行的/var/www/symfony/mosys tool collection/symfony/var/cache/dev/ContainerXfIwZpI/getSecurity\u Firewall\u Map\u Context\u MainService.php中调用

    handlers: [App\Listeners\LogoutListener] 我还需要配置什么?