2016-02-23 70 views
5

如果我有一個安全的路線,比如說從下面的panel,Symfony將只允許登錄用戶訪問。Symfony安全重定向到登錄頁面

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/panel, role: ROLE_USER } 

對於未在其登錄總會將其重定向到login_path(我使用FOSUserBundle)用戶:

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:  fos_user_security_login 

我在哪裏可以禁用或覆蓋該重定向?我想直接顯示登錄表單,而不用重定向用戶。

我認爲它與AccessDeniedHandlerInterface有關,但是什麼關鍵需要在security.yml中覆蓋?哪裏是默認實現?

對於其他情況,我們有DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandler,我們可以針對每種情況實施服務,這些服務可以擴展各自的接口並以自定義的方式處理情況。但是,無法找到任何AccessDenied。 Its directory只包含接口。

+2

有什麼好處?登錄後用戶會被重定向回/面板,它不會有什麼不同 - 我錯過了什麼? – ccKep

+0

我想在幾條路線上添加一個登錄頁面。用戶想要訪問該頁面,但他沒有登錄,所以我向他展示登錄表單,並在登錄後(使用ajax)將其重定向到面板。 –

+0

要顯示登錄表單,您應該允許匿名訪問。因此,在控制器中檢查權限 – Heah

回答

3

我會這樣做手動。

要讓路由匿名訪問:

- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] } 

在你的模板,檢查是否有登錄的用戶:

{% if app.user is null %} 
    <!-- Then display your login form --> 
{% else %} 
    <!-- Display the normal view --> 
{% endif %} 

,或者與控制器做到這一點:

if (!is_object($this->get('security.token_storage')->getToken()->getUser())) { 
    // Render the login form 
} 

像這樣,您可以根據用戶是否通過認證來制定邏輯。

+0

考慮到用戶想要訪問面板頁面,並且他被重定向到顯示登錄表單(使用ajax進行驗證)的頁面,我怎麼知道登錄後在哪個頁面重定向用戶(在本例中爲頁面)以及我如何知道用戶是否最初想要登錄(登錄表單是模式並且內容是通過ajax檢索的)? –

+0

在你的問題中,你說的是你不想重定向用戶,只顯示登錄表單。要知道用戶試圖訪問哪個頁面,可以使用''app.request.headers.get('referer')'從樹枝或'$ this-> getRequest() - > headers-> get('referer')'從控制器。然後,如果你想在登錄後重定向到引用者,添加一個'_target_path'作爲表單字段,用檢索到的引用者填充它,並在處理表單的方法中進行重定向(如果你的表單由FOSUser處理,_target_path '會自動使用)。如果您需要示例,我可以進行快速編輯。 – chalasr

+0

好主意,會做。 –