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

Php 如何匹配url';s反对Symfony';安全访问控制,php,symfony,acl,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_A

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

等等

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

    {# my menu.twig.html #}

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

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

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

要获得它,您可以访问
安全性。使用
安全性访问应用程序中的\u控制
参数。访问\u地图
服务

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

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


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

我想你可以看看这里:@Andreysobkanuk谢谢,这正是我一直在寻找的,但我认为对于这样一个简单的需求来说,这个解决方案是过火了。。Symfony这样做的方式似乎是根据角色手动配置菜单,我认为这是完全愚蠢的,因为这种方式你定义了所有东西两次。。。但我会坚持这样做,因为我没有资源和时间来实现另一个ACL或在其中扩展symfonies构建。我想不幸的是,这是唯一的解决方案。如果您愿意,我可以将其作为独立答案发布。@AndreySobkanyuk这样做:)我在菜单的标准_布局中使用类似的内容:{%if display%}{%for admin in group.items if item_count==0%}{%if admin.hasroute('list'))和admin.isgrated('LIST')%}{%set item_count=item_count+1%}{%endif%}{%endfor%}{%endif%}这不是我正在搜索的解决方案,我已经在
security.yml
im中配置了角色访问权限,正在寻找使用此处配置的数据的解决方案。我不想把每件事都定义两次。你能告诉我们你在哪里以及如何构建你的菜单吗?