Symfony的安全系统功能强大, 可让你向用户添加角色。用户登录时, 他们会收到一组角色(例如ROLE_ADMIN), 这些角色可能存储在表(或内存)中的列上, 并在项目的security.yml文件中声明。
在视图中, 如果将twig用作首选模板引擎, 则可以使用以下代码检查会话是否具有所需角色。
{#
We will use the is_granted twig function, this will return a boolean according to the statement, to check a specific role use :#}{% if is_granted('ROLE_ADMIN') %}
Do something here{%endif%}
【检查已签名的用户在Symfony 2和3中是否具有特定角色】例如, 如果你想为所有用户(所有角色)创建一个登录和退出菜单, 则可以这样创建:
{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
<
a href="http://www.srcmini.com/{{ path('fos_user_security_logout') }}">
Sign out
<
/a>
{% else %}
<
a href="http://www.srcmini.com/{{ path('fos_user_security_login') }}">
Sign in<
/a>
{% endif %}
为了检查控制器中的活动用户角色, 我们将使用isGranted方法, 该方法可以从Symfony的安全上下文中检索。使用以下代码检查php中的角色。
// If you are in a symfony controllerif ($this->
get('security.context')->
isGranted('ROLE_ADMIN')) {
// Execute some php code here}// Or if you are using a symfony extension (and you are injecting the container)//Note that you need to have a variable defined as the symfony container (for example in a symfony extension you send it as parameter)$container = someMethodThatRetrievesTheSymfonyContainer();
if($this->
container->
get('security.context')->
isGranted('ROLE_ADMIN')){
//Execute some php code}// If you just want to prevent that a user without a specific role enter to some area, you can use the latest shortcut in the controllers:$this->
denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page :( you are not admin');
如果用户未处于活动状态(已记录), 并且你需要从数据库中检查该用户是否具有特定角色, 则可以使用此功能来确定该角色。
该函数将用户的ID作为第一个参数, 将角色的名称作为第二个参数, 请记住你的用户结构可能不同, 并且你需要更改搜索方式, 例如, 按其他字段而不是按ID进行搜索。
/** * @string|int $id * @string $role */public function userHasRole($id , $role) {
// Entity manager
$em= $this->
getDoctrine()->
getManager()
$qb = $em->
createQueryBuilder();
$qb->
select('u')
->
from('userBundle:User', 'u') // Change this to the name of your bundle and the name of your mapped user Entity
->
where('u.id = :user')
->
andWhere('u.roles LIKE :roles')
->
setParameter('user', $id)
->
setParameter('roles', '%"' . $role . '"%');
$user = $qb->
getQuery()->
getResult();
if(count($user) >
= 1){
return true;
}else{
return false;
}}// Then you can use it like :$devId = 123;
if(userHasRole($devId, "ROLE_DEVELOPER")){ // Send mail to DEVELOPERS}
推荐阅读
- 如何在TCPDF中实现自定义字体
- 如何使用TCPDF在PDF上添加水印
- 在WinForms中使用EasyTabs创建具有Chrome样式选项卡的C#应用??程序
- 使用C#在Windows 10(控制中心样式)中创建通知
- CS201 分配
- CSc 360 简单文件系统
- Android上点击EditText将不会显示软键盘
- 如何在iPhone或Android上打开WhatsApp打开数字,如+55(51)9988-7766
- 如何使用普通的POST请求将文件发送到apps脚本()