将所有路由重定向到一个URL,直到满足条件

时间:2014-02-19 22:04:11

标签: php symfony

我有一个用户实体,它有一个布尔“hasTmpPassword”。在用户更改密码之前,此布尔值设置为true。

使用临时密码登录后,我重定向到我的changePassword页面(使用DefaultAuthenticationSuccessHandler)

如何阻止登录用户(使用临时密码)访问网站的其他页面,并始终将他重定向到changePassword页面?

谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 登录该用户后,您应该在其会话中设置标志(即。 changePasswordNeeded)。

    $ request-> getSession() - > set('changePasswordNeeded',true);

  2. 添加侦听器,将触发onKernelRequest

    kernel.listener.your_listener_name:     class:YourLitenerClass     标签:        - {name:kernel.event_listener,event:kernel.controller,method:onKernelRequest}

  3. 重定向以形成除change_temp_password请求之外的每个请求 (对于选定的用户)

    public function onKernelRequest(FilterControllerEvent $ event){

      $request = $event->getRequest();
    
      if ($request->getSession()->has('changePasswordNeeded')) {
        $expectedRoute = 'change_temp_password';
        if ($expectedRoute === $event->getRequest()->get('_route')) {
          return;
        }
    
        $url = $this->router->generate($expectedRoute);
        $response = new RedirectResponse($url);
        $event->setResponse($response); 
      }        
    }
    

答案 1 :(得分:0)

我不熟悉symfony2,但在普通的php中,我会设置一个会话变量来指示临时密码用于身份验证。然后,您可以检查该变量是否已设置/具有您处理身份验证的特定值,并在用户尝试访问其他页面时重定向到密码更改页面。