问题 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') ) {

} 

11008
2017-07-26 16:49


起源

去除 non_secure_area 防火墙,这是不必要的。 - Emii Khaos


答案:


您可以在其上获取安全令牌和访问提供程序密钥。

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

别忘了检查该令牌是否存在而且它不是一个实例 AnonymousToken


10
2017-07-26 20:57



谢谢,但我个人仍然认为这还不够(当然在Symfony2中可能不可能,因为它可以做更多,虽然这可能意味着你的答案是最好的)。如果'secured_area'的名称发生了变化,那么我们就会遇到问题。想象一下,创建一个发布包,你无法确定某人的app / config / security.yml防火墙名称是什么。如果查看路由需要用户登录,是否没有选项只返回true? - user2143356
例如,您可以检查任何角色 ROLE_USER。如果你只想检查那个用户输入密码os somethins check IS_AUTHENTICATED_FULLY。 symfony.com/doc/current/book/... - Alexey B.
谢谢,但它不是我想要的User对象。我会说检查路由是否在安全防火墙内是否与User对象无关。 - user2143356
查 IS_AUTHENTICATED_FULLY - Alexey B.
只是指点 getProviderKey 是不需要的 TokenInterface,所以这只是一个实现细节 UsernamePasswordToken, PreAuthenticatedToken 和 RememberMeToken。 - xPheRe


如果你喜欢的话 ContainerAware,你可能会得到 Request,然后是URI [看文档]:

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

然后你可以检查这样的字符串 /admin 如你所愿。


0
2017-07-26 17:38



你好。谢谢,但我希望有一个更好的方法,比如一个与安全区域或URL名称无关的方法。如果我在控制器中编写了类似你的代码但是我的app / config / security.yml包含了不同的路径,那么事情就会破裂。也许如果有可能获得当前使用的防火墙的名称和参数(如果有的话),我可以将URI与该防火墙的“模式”(在配置中定义)匹配。 - user2143356