大家好,我是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 %}
顺便说一句,你可以在你的控制器中做同样的事情,但我认为你的布局包含菜单,所以我发布了一个小树枝答案。告诉我它是否对你有用。