如何匹配针对Symfony安全访问控制的URL

时间:2015-02-09 08:41:28

标签: php symfony acl

大家好,我是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

等。

2 个答案:

答案 0 :(得分:1)

现在Symfony通过一个函数获取此信息没有简单的方法。

要获得此功能,您可以使用security.access_control服务访问应用中的security.access_map个参数。

但是您无法直接从容器中请求它,因为它是私人服务,因此必须将其注入其他服务。

只有这样,您才能使用Twig功能编写自己的isUrlGranted()扩展程序。

P.S。:我的回答只是关于类似问题的写得很好answer的简短摘要。

答案 1 :(得分:0)

如果您在视图中使用twig(应包含菜单),则可以使用以下方法测试用户角色:

    {# my menu.twig.html #}

    {% if app.security.isGranted('ROLE_ADMIN', app.user) %}
        ....
    {% endif %}

顺便说一句,您可以在控制器中执行相同操作,但我认为您的布局包含菜单,所以我发布了一个枝条答案。告诉我它是否与您相关并对您有所帮助。