2013-07-26 34 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