2013-07-26 46 views
11

我想知道用戶是否在安全防火牆內。Symfony2 - 檢測用戶是否在安全防火牆內

security.yml:

firewalls: 
    non_secure_area: 
     pattern: ^/ 
     anonymous: true 
    secure_area: 
     pattern: ^/admin 
     form_login: 
      #etc. 
     logout: 
      #etc. 

所以,我需要知道,如果用戶是「secure_area」固定網站的一部分內。

我已經使用了這個,但它當然只是告訴我,如果有人「登錄」,並在HTTPS頁面。必須有一個更好的辦法:

if($request->isSecure() && $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) { 

} 
+0

實例刪除'non_secure_area'防火牆,這是不必要的。 –

回答

10

您可以獲取安全令牌和訪問提供商密鑰。

$token = $securityContext->getToken(); 
$providerKey = $token->getProviderKey(); // secured_area 

不要忘記檢查令牌存在,它不是AnonymousToken

+0

謝謝,但我個人認爲這還不夠(當然,在Symfony2中可能無法做到,因爲它可以做更多,儘管這可能意味着您的答案是最好的)。如果'secured_area'的名稱改變了,那麼我們會遇到問題。想象一下,創建一個分發包,你不能確定某人的app/config/security.yml防火牆名稱是什麼。如果路徑查看需要用戶登錄,是否沒有簡單地返回true的選項? – user2143356

+0

您可以檢查任何角色,例如'ROLE_USER'。如果您只想檢查用戶輸入密碼,請檢查「IS_AUTHENTICATED_FULLY」。 http://symfony.com/doc/current/book/security.html#retrieving-the-user-object –

+0

謝謝,但它不是我想要的用戶對象。我會說,檢查路由是否在安全防火牆內部,與User對象無關。 – user2143356

0

如果你到的東西是ContainerAware,您可能會收到Request,然後將URI [see docs]:

$request = $this->container->get('request'); 
$uri = $request->getUri(); 

然後你就可以檢查這些字符串只要你願意,就可以對着/admin

+0

嗨。謝謝,但我希望有一個比這更好的方法,比如一個不受保密區域或URL名稱限制的方法。如果我在控制器中編寫像上面這樣的代碼,但是隨後我的app/config/security.yml包含了不同的路徑,那麼事情就會崩潰。也許,如果可以獲取正在使用的當前防火牆的名稱和參數(如果有的話),則可以將URI與該防火牆的'模式'(如配置中定義的)匹配。 – user2143356