2017-01-03 172 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"); 
     } 
    } 
}