如何检查用户是不是具有特定角色并因此允许某些操作?

Posted

技术标签:

【中文标题】如何检查用户是不是具有特定角色并因此允许某些操作?【英文标题】:How do I check if a user has certain role and therefore allow some actions?如何检查用户是否具有特定角色并因此允许某些操作? 【发布时间】:2014-11-03 21:24:14 【问题描述】:

我需要检查登录用户是否在系统上具有某些角色,以便我允许或不允许某些操作。我正在使用 JMSSecurityExtraBundle 并且我检查了 Expression Based Authorization 的文档,但我做错了,因为代码不起作用。看看这段代码:

use JMS\SecurityExtraBundle\Annotation\Secure;
use JMS\SecurityExtraBundle\Security\Authorization\Expression\Expression;

if ($this->get('security.context')->isGranted(array(new Expression('hasRole("ROLE_ADMIN")')))) 
    echo "Enter";
 else 
    echo "Do not enter";

但任何时候我登录时,即使作为拥有所有权限并拥有 ROLE_ADMIN 的 ADMIN,我看到的唯一文字是“请勿输入”,这是完全错误的。在here 中解释的示例代码中,作者使用了$securityContext var,但它来自哪里?这个 var 是在哪里定义的?我假设它将指向SecurityContext,但我不太确定,我的代码问题出在哪里?如何检查用户是否具有特定角色并因此允许其执行某些代码?

【问题讨论】:

你为什么不直接使用->isGranted('ROLE_ADMIN') 怎么样?能否请您写一小段代码来理解它? 【参考方案1】:

如果您只想检查用户在控制器中的角色,则不需要使用任何注释表达式,这就足够了:

if ($this->get('security.context')->isGranted('ROLE_ADMIN')) 
    echo "Enter";
 else 
    echo "Do not enter";

在 google 上快速搜索一下就会立即返回有关该内容的文档部分:http://symfony.com/doc/current/book/security.html#access-control

【讨论】:

【参考方案2】:

我允许或不允许某些操作。

如果您指的是控制器中的常规操作,那么方便的快捷方式是使用来自SensioFrameworkExtraBundle 的@Security 注释。

/**
 * @Security("has_role('ROLE_ADMIN')")
 */
public function indexAction()

    // ...

但是,这并不是您在 Symfony 2 中开发基于角色的操作的真正方式。您可以在 access_control 中定义它。

# app/config/security.yml
security:
    # ...
    access_control:
        -  path: ^/admin/users, roles: ROLE_SUPER_ADMIN 
        -  path: ^/admin, roles: ROLE_ADMIN 

【讨论】:

这是另一种方式,但如果我有 500 个控制器,那么我将在 security.yml 上有 500 行,这不是这个想法,我更喜欢在注释上传递这个。在另一边,我会检查 ROLE 是否有其他条件而不是完整功能,无论如何谢谢

以上是关于如何检查用户是不是具有特定角色并因此允许某些操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是在 Meteor 中具有特定角色

检查提到的用户是不是在 discord.js 中具有角色

检查用户是不是具有 x 角色之一,然后从他们中删除该角色

Discord.py - 检查用户是不是具有执行命令的特定角色

如何检查成员是不是具有特定角色

如何检查用户是否属于服务器端的某些用户标准?