如何检查用户是否具有某个角色,从而允许某些操作?

时间:2014-11-03 21:24:15

标签: php symfony security-context

我需要检查登录用户是否在系统上具有某些角色,因此我允许或不允许某些操作。我正在使用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,但我不太确定,我的代码问题在哪里?如何检查用户是否具有某个角色,从而允许它执行某些代码?

2 个答案:

答案 0 :(得分:1)

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

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

谷歌上的一个快速搜索会立即返回关于该文档的文档部分:http://symfony.com/doc/current/book/security.html#access-control

答案 1 :(得分:1)

  

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

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

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

但是,这并不是你应该如何在Symfony 2中开发基于roled的动作的方法。你可以在access_control中定义它。

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