如何匹配url';s反对Symfony';的安全访问控制


How to match url's against Symfony's security access control

大家好,我是Symfony的新手,有一个简单的问题。

security.yml文件中,我设置了一些访问控制路径:

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: .*settings, roles: ROLE_USER }
    - { path: ^/$, roles: ROLE_USER }
    - { path: ^/.*, roles: ROLE_ADMIN }

到目前为止,这是我想要的。

现在我正在构建一个菜单,并希望根据其访问权限隐藏显示导航项,那么我如何获取这些信息呢?

必须有一些功能,如:

$securityContext->isUrlGranted( $this->generateUrl('homepage') );

谢谢你的帮助。

编辑

示例:

// current user is ROLE_ADMIN:
$acl->isUrlGranted( 'foo/bar' ); // true
$acl->isUrlGranted( 'login' ); // true
// IS_AUTHENTICATED_ANONYMOUSLY
$acl->isUrlGranted( 'login' ); // true
$acl->isUrlGranted( 'something/else' ); // false
// ROLE_USER
$acl->isUrlGranted( 'settings/profile' ); // true
$acl->isUrlGranted( 'foo/bar' ); // false

等等。。

现在Symfony中没有简单的方法可以通过一个函数获得这些信息。

要获得它,您可以使用security.access_map服务访问应用程序中的security.access_control参数。

但是您不能直接从容器中请求它,因为它是一个私有服务,所以必须将它注入到另一个服务中。

只有这样,您才能用isUrlGranted()函数编写自己的Twig扩展。

附言:我的回答只是对类似问题的书面回答的简短总结。

如果您在视图中使用的是trick(应该包含菜单),您可以使用以下工具测试用户角色:

    {# my menu.twig.html #}
    {% if app.security.isGranted('ROLE_ADMIN', app.user) %}
        ....
    {% endif %}

顺便说一句,你可以在你的控制器中做同样的事情,但我认为你的布局包含菜单,所以我发布了一个小树枝答案。告诉我它是否对你有用。