2017-01-03 153 views
0

我的symfony3登录页面默认重定向到主页,如我的security.yml文件中所述。用户登录后Symfony重定向

但是,如果用户还没有完成它,我希望它重定向到我的“编辑个人资料”页面。在任何其他形式中,我会在控制器中进行此操作,但由于登录表单中没有$form->handleRequest($user),因此我没有要测试的$user变量。

有很多关于如何根据角色重定向用户的SO主题,并且documentation讲述了从表单的操作字段或security.yml重定向,但没有任何我正在寻找的东西。

如何根据条件重定向?

注:由于某些原因,我无法使用FOSUserBundle尚未:-(

+0

您可以在表单中重定向有了这样的自定义输入:http://symfony.com/doc/current/security/form_login。 html – davidbonachera

+0

这是我推测你知道的完全相同的链接... –

+0

哎呀..一种方法可能是使用会话/ cookie和重定向,如果它是空的。 http://symfony.com/doc/current/components/http_foundation.html#setting-cookies/ http://api.symfony.com/3.2/Symfony/Component/HttpFoundation/Cookie.html – davidbonachera

回答

0

我假设你使用的是保护认证系统(http://symfony.com/doc/current/security/guard_authentication.html

那么你应该有扩展AbstractGuardAuthenticator类的类。

在这一类中,有一个名为onAuthenticationSuccess方法,在这里你可以把一些逻辑重定向请求。 如果返回null在这里,它只会继续,并使用您的安全配置的路由。阳明海运。

您需要通过dependencyInjection将@router服务传递给Authenticator类。

假设你通过路由器服务,你的方法会是这个样子:

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
{ 
    /** @var User $user */ 
    $user = $token->getUser(); 

    if ($user->hasCompleteProfile() == false) { 
     $url = $this->router->generate('edit_profile'); 

     return new RedirectResponse($url); 
    } 

    // Continue with default behaviour 
    return null; 
} 
+0

其实我用[a简单注册表格](https://symfony.com/doc/current/doctrine/registration_form.html)和[传统登录表格](https://symfony.com/doc/current/security/form_login_setup.html )。我会研究Guard身份验证系统,但是我建立的网站并不是因为拥有坚如磐石的安全性,所以它可能是一种矫枉过正的行为...... –

0

如果一切都失败(或变成过度疼痛处理),你总是可以简单介绍一下中介的路线,做你的逻辑在那里。

也就是说,创建一个动作,其唯一目的是根据需要的逻辑重定向用户,然后将其作为目标路径放入security.yml防火墙中。

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: login 
       check_path: login 
       default_target_path: login_success 
       always_use_default_target_path: true 
      logout: 
       path: logout 

凡登录会是这样的:

class AuthenticationController extends Controller 
{ 
    /** 
    * @Route("/login", name="login") 
    * @Route("/logout", name="logout") 
    */ 
    public function loginAction(Request $request) 
    { 
     // Standard login stuff here 
    } 

    /** 
    * @Route("/login_success", name="login_success") 
    */ 
    public function postLoginRedirectAction() 
    { 
     if (/* user needs to see location A */) { 
      return $this->redirectToRoute("location_a"); 
     } else if (/* user needs to see location B */) { 
      return $this->redirectToRoute("location_b"); 
     } else { 
      return $this->redirectToRoute("index"); 
     } 
    } 
}