2017-04-01 112 views
0

在使用Symfony2重寫應用程序時,我試圖保留一些傳統行爲,並且正在尋找乾淨的解決方案。根據身份驗證路由到不同的控制器

我的目標是有URI「/」顯示啓動頁面,如果用戶沒有登錄,同一個URI顯示每個用戶的儀表板,如果他們已登錄。

該解決方案還需要可擴展性 - 「公共」網站上有幾個頁面在「私人」網站上有不同的表示(即索引,支持,關於,聯繫等) - 因此,我不能簡單地使用catch-全部路由並自己轉發給正確的控制器。

我有一個潛在的解決方案,我將作爲答案發布,但我正在尋求更好方法的建議。

回答

0

N.B.這個答案是一種黑客行爲;我發佈它希望找到更好的方法。實現這一

的一種方法是利用路由系統的支持下爲conditions - 這並沒有影響URL生成並允許路由系統照顧參數的優勢,等

然而,爲了將條件用於此目的,我們需要通過Request或RequestContext(僅有的兩個可用變量)公開請求的身份驗證狀態。

這可以通過創建在RouterListener之前運行的EventListener並將認證狀態存儲在請求的屬性中來完成。

不幸的是,如event reference所示,防火牆只在RouterListener之後運行,這意味着我們的偵聽器中不存在身份驗證狀態。

據我所知,唯一的解決方案是修改優先級,使防火牆先運行,然後運行我們的新EventListener,最後運行RouterListener。這幾乎肯定是一個壞主意,並且可能會導致意想不到的效果。

我很歡迎任何有關如何實現這一目標的更好建議。

0

我在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>&nbsp; 
     {# Useful stuff #} 
    {% else %} 
     {# Show login link, or give other info #} 
     <li><a href="{{ path('security_login') }}">Login</a></li> 
    {% endif %}