我有一个管理面板,并为它定义了一个角色ROLE_ADMIN
。在我的 security.yml 文件中,我使用了一种模式^/admin/*
,因此 /admin 下的所有内容都需要ROLE_ADMIN
. 现在在我的应用程序的前端,我需要检查用户角色以及角色是否ROLE_ADMIN
呈现一个文件,否则呈现另一个文件。此 url 不属于 security.yml 中定义的模式。
那么如何在不属于 security.yml 中定义的模式的主页上检查用户是管理员还是普通用户?
使用该模式在整个应用程序上启用防火墙^/
,允许匿名访问并使用access_control
限制访问:
security:
firewalls:
secured_area:
pattern: ^/
anonymous: ~
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
正如@itsmequinn 建议的那样,使用isGranted()
安全上下文的方法:
if ($this->get('security.context')->isGranted('ROLE_BRAND')) {
// the user has the ROLE_BRAND role, so act accordingly
}
在Symfony 2.6中,security.context
已被拆分为两个独立的服务。因此,您需要使用该security.authorization_checker
服务来解决问题:
if ($this->get('security.authorization_checker')->isGranted('ROLE_BRAND')) {
// the user has the ROLE_BRAND role, so act accordingly
}
Symfony 3.0
之前Symfony 2.6
你会使用SecurityContext
.
SecurityContext
将被弃用,Symfony 3.0
取而代之的是AuthorizationChecker
.
供Symfony 2.6+
&Symfony 3.0
使用AuthorizationChecker
。
if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
# User is a ROLE_ADMIN
}
if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
# User is a ROLE_ADMIN
}
类似问题:如何检查用户是否在控制器内登录 Symfony2?
在此处阅读更多文档:AuthorizationChecker
您在页面的控制器中吗?如果是这样,请使用isGranted
安全上下文的方法:Access Controls for Controllers
在Symfony 4 及更高版本中,您应该使用如下代码,而不是使用 $this->get('security.authorization_checker') 之类的服务:
$hasAccess = $this->isGranted('ROLE_ADMIN');
$this->denyAccessUnlessGranted('ROLE_ADMIN');
最简单的解决方案是注释。而不是这个:
if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
# User is a ROLE_ADMIN
}
..尝试使用这个:
/**
* ...
* @Security("has_role('ROLE_ADMIN')")
*/
.. 或者 :
/**
* ...
* @Security("is_granted('POST_ADD', post)")
*/
public function addAction(Post $post){...}