2016-04-30 246 views
0

在Symfony2/3項目中,如果匿名用戶位於半保護頁面上(其中頁面的部分內容僅顯示給登錄用戶),並且他們單擊一個鏈接,指出「登錄查看更多詳細信息',我如何將它們重定向到登錄後所在的頁面?登錄後Symfony重定向

由於Symfony安全框架自動處理重定向,這與他們點擊完全受保護頁面的鏈接時不同。

有沒有像這樣的內置內容,或者我將不得不添加它?我正在考慮在登錄頁面的鏈接末尾添加一個查詢參數,名稱爲redirect。例如,在嫩枝,

<a href="{{ path('login_route', {'redirect': '/profile/123'}) }}"> 
    Sign in to view more details 
</a> 

這將使作爲

<a href="/user/login?redirect=/profile/123">Sign in to view more details</a> 

如果此功能已經不存在了,我知道我將不得不在LoginController添加一些東西到loginCheckAction(其目前沒有被使用,因爲路由是由安全系統處理的),但我不知道如何。

Here是Security Bundle的配置頁面,其中列出了所有的選項,但是我找不到任何關於我在找什麼的東西。

回答

0

儘管Krukov的回答並沒有解決我的問題,但確實讓我朝着正確的方向前進。如documentation中所述,您可以添加一個name屬性_target_path的隱藏表單輸入到登錄表單,並且它將嘗試重定向到此輸入的值。

所以在我的LoginController ::在loginAction,我檢查,如果有一個目前redirect查詢參數,如果是這樣,它發送到樹枝模板,並添加隱藏的輸入:

public function loginAction(Request $request) 
{ 
    $page = $this->templating->render('AppBundle::login.html.twig', [ 
     'redirect' => $request->query->get('redirect') ?: null, 
    ]); 

    return new Response($page); 
} 

在模板:

<form action="{{ path('login_check') }}" method="post"> 
    {% if redirect %} 
     <input name="_target_path" type="hidden" value="{{ redirect }}"> 
    {% endif %} 

    <label for="username">Username</label> 
    <input type="text" id="username" name="_username" value="{{ last_username }}" required> 

    <label for="password">Password</label> 
    <input type="password" id="password" name="_password" required> 

    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"> 
    <button type="submit">Sign in</button> 
</form> 

(多餘代碼刪除。)

+0

請注意,這不是傻瓜。如果用戶輸入正確的用戶名和密碼,它就可以工作。但是,如果他們輸入錯誤,那麼它會跳回到登錄頁面並顯示一條錯誤消息 - 但重定向查詢參數已消失。 – user128216

1

您應該添加一個監聽器登錄您的安全包的成功事件,或者,或者擴展包和實現自己的登錄動作裏面 (documentation

+0

這似乎對我的需要過於複雜。我遇到了一個可能更簡單的解決方案(請參閱我對Krukov的回答的評論),我將嘗試。 – user128216

0

您可以直接在應用程序中使用「default_target_path」/config/security.yml 看看這些文檔:http://symfony.com/doc/current/cookbook/security/form_login.html

+0

不,這不是我要找的。我不希望這種行爲發生在每次登錄時,只是在某些情況下。但是閱讀那個文檔頁面,我偶然發現了一個潛在的解決方案。如果名爲'_target_path'的隱藏字段被添加到登錄表單中,它將覆蓋默認的重定向。因此,我所要做的就是在'LoginController :: LoginAction'函數中檢查是否有一個名爲'redirect'的查詢參數,如果存在,則將隱藏的'_target_path'輸入添加到登錄表單中。我明天就試試,如果有效,請將其作爲自我回答。 – user128216