在使用Symfony2重寫應用程序時,我試圖保留一些傳統行爲,並且正在尋找乾淨的解決方案。根據身份驗證路由到不同的控制器
我的目標是有URI「/」顯示啓動頁面,如果用戶沒有登錄,同一個URI顯示每個用戶的儀表板,如果他們已登錄。
該解決方案還需要可擴展性 - 「公共」網站上有幾個頁面在「私人」網站上有不同的表示(即索引,支持,關於,聯繫等) - 因此,我不能簡單地使用catch-全部路由並自己轉發給正確的控制器。
我有一個潛在的解決方案,我將作爲答案發布,但我正在尋求更好方法的建議。
在使用Symfony2重寫應用程序時,我試圖保留一些傳統行爲,並且正在尋找乾淨的解決方案。根據身份驗證路由到不同的控制器
我的目標是有URI「/」顯示啓動頁面,如果用戶沒有登錄,同一個URI顯示每個用戶的儀表板,如果他們已登錄。
該解決方案還需要可擴展性 - 「公共」網站上有幾個頁面在「私人」網站上有不同的表示(即索引,支持,關於,聯繫等) - 因此,我不能簡單地使用catch-全部路由並自己轉發給正確的控制器。
我有一個潛在的解決方案,我將作爲答案發布,但我正在尋求更好方法的建議。
N.B.這個答案是一種黑客行爲;我發佈它希望找到更好的方法。實現這一
的一種方法是利用路由系統的支持下爲conditions - 這並沒有影響URL生成並允許路由系統照顧參數的優勢,等
然而,爲了將條件用於此目的,我們需要通過Request或RequestContext(僅有的兩個可用變量)公開請求的身份驗證狀態。
這可以通過創建在RouterListener之前運行的EventListener並將認證狀態存儲在請求的屬性中來完成。
不幸的是,如event reference所示,防火牆只在RouterListener之後運行,這意味着我們的偵聽器中不存在身份驗證狀態。
據我所知,唯一的解決方案是修改優先級,使防火牆先運行,然後運行我們的新EventListener,最後運行RouterListener。這幾乎肯定是一個壞主意,並且可能會導致意想不到的效果。
我很歡迎任何有關如何實現這一目標的更好建議。
我在symfony3上,但這是我的方法。登錄後,我將所有用戶發送到/ login/redirect,並使用下面顯示的控制器。這很簡單,並使用內置的ROLES_ *功能。
/**
* Redirect users after login based on various checks
*
* @Route("/login/redirect", name="_login_redirect")
*/
public function loginRedirectAction()
{
// Send user to admin page or order page based on credentials
if ($this->isGranted('ROLE_SUPERUSER')) {
return $this->redirectToRoute('admin_home');
} elseif ($this->isGranted('ROLE_ADMIN')) {
return $this->redirectToRoute('dashboard');
} else {
return $this->redirectToRoute('order_page');
}
}
要處理那些未登錄,我在我的樹枝模板中使用一些簡單的邏輯。請注意,symfony自動爲所有登錄用戶提供ROLES_USER角色。
{% if is_granted('ROLE_USER') %}
{# User is logged in, do something appropriate #}
<li>{{ app.user ? app.user.name : '' }}</li>
{# Useful stuff #}
{% else %}
{# Show login link, or give other info #}
<li><a href="{{ path('security_login') }}">Login</a></li>
{% endif %}