2012-07-25 133 views
0

我想解決我的Symfony 2應用程序中的這種不一致性:當用戶是而不是經過驗證的路徑/app/logout重定向到/app/login。相反,未通過身份驗證的用戶應查看錯誤頁面(可能爲403)。註銷路由中的Symfony 2不一致:註銷重定向到登錄?

以下是安全配置。該IS_AUTHENTICATED_FULLY似乎強制性的,作爲一個用戶可以做註銷只有當它以前完全認證:

access_control: 
    - { path: ^/app/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/app/logout, roles: IS_AUTHENTICATED_FULLY } 

而且我AccessController的註銷操作:

/** 
* @Extra\Route("logout") 
* @Extra\Template 
*/ 
public function logoutAction() 
{ 
    // Set the token to null and invalidate the session 
    $this->getSecurityContext()->setToken(null); 
    $this->getSession()->invalidate(); 

    // Redirect url and seconds (window.location) 
    $seconds = 5; 
    $redirect = $this->getRouter()->generate('access_login'); 

    return array('seconds' => $seconds, 'redirect' => $redirect); 
} 

一個解決辦法是從接入移除路線/app/logout控件,然後拋出一個異常,如果用戶它不是完全認證:

if(false === $this->getSecurityContext()->isGranted('IS_AUTHENTICATED_FULLY')) 
    throw new AccessDeniedException(); 

但是這樣一來即使沒有經過身份驗證的用戶也可以訪問!有人知道更好的解決方案

回答

1

只需從access_control刪除註銷路徑即可。如果沒有經過身份驗證的用戶轉到註銷頁面,將會發生什麼不良 - 這是安全的。不要濫用這些東西。 ;)

順便說一句,爲什麼你不使用Symfony的內置註銷控制器?您可以創建一個註銷處理程序來將自定義代碼放入其中,而不是通過自己處理所有註銷內容來重新發明輪子。

+0

使用註銷處理程序而不是自定義控制器操作會有什麼區別? – gremo 2012-07-25 10:09:46

+1

這對Symfony來說更具有慣性。解決問題時使用內置解決方案;只有在沒有可用的滿意解決方案時才使用您的自定義代碼。如果在未來版本的Symfony中註銷邏輯發生變化會怎樣?你必須注意並更新你的代碼。如果你使用內置的東西,你不必打擾。 – 2012-07-25 10:58:49