如何将 url 与 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

等..

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

    {# my menu.twig.html #}

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

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

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

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

但是不能直接从容器中请求,因为是私有服务,需要注入到其他服务中。

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

P.S.: 我的回答只是对类似问题 answer 写得很好的简短总结。