如何检查用户是否具有特定角色,从而允许执行某些操作


How do I check if a user has certain role and therefore allow some actions?

我需要检查登录的用户在系统中是否具有某些角色,以便允许或不允许某些操作。我正在使用JMSSecurityExtraBundle,并检查文档中的基于表达式的授权,但由于代码不起作用,我做了一些错误的事情。看看这个代码:

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,我看到的唯一文本也是"请勿输入",这是完全错误的。在这里解释的示例代码中,作者使用了$securityContext变量,但它来自哪里?这个var在哪里定义?我假设它会指向SecurityContext,但我不太确定,我的代码的问题在哪里?如何检查用户是否具有特定的角色,从而允许其执行某些代码?

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

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

在谷歌上快速搜索一下,就会立即返回相关文档部分:http://symfony.com/doc/current/book/security.html#access-控制

我允许或不允许某些行为。

如果您指的是控制器中的常规操作,那么方便的快捷方式是使用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 }