yii RBAC和yii控制器访问规则

时间:2014-03-19 17:10:47

标签: yii controller rbac access-rules

我正在尝试自定义RBAC,因此我为用户设置了几个角色。

现在我正在尝试了解如何告诉控制器应该由哪个角色访问哪个动作。

在Controllers代码中,我看到了这个

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),

现在我认为'用户'意味着成为RBAC的用户角色,但我想我完全错了。 所以一方面我有这个accessRules,另一方面我有RBAC的几个角色。如何告诉控制器使用我的角色?

Jonny的更新

听起来很有趣...... 我已经做了测试行动

public function actionNew()
    {
        echo 'TEST'; die;

然后我让所有人都可以访问规则,仅用于测试

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),


        array('allow',
            'actions'=>array('new'),
            'users'=>array('*'),
        ),
    );
}

但它不起作用:(任何想法为什么?

我正在

Error 403
You are not authorized to perform this action.

更新2

Ok测试操作适用于*用户。

现在我正在尝试将它与我的角色联系起来,我被困在那里:(

array('allow',
        'actions'=>array('new'),
        'roles'=>array('role1'),
    ),

不工作:(

在页面上,带有调用此操作的按钮,我有滚动检查代码

if(Yii::app()->user->checkAccess('role1')){
    echo "hello, I'm role1";
}

Jonny的最新更新 谢谢你的帮助,我终于做到了。 我不知道为什么,但问题是我必须在拒绝数组之前放置所有这些新动作。

喜欢这个

public function accessRules()
    {
        return array(
            array('allow',  // allow all users to perform 'index' and 'view' actions
                'actions'=>array('index','view'),
                'users'=>array('*'),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions'=>array('create','update'),
                'users'=>array('@'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions'=>array('admin','delete'),
                'users'=>array('admin'),
            ),
            array('allow',
                'actions'=>array('new'),
                'roles'=>array('role1'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),



        );
    }

在这种情况下,它有效。之前我的新操作位于“拒绝”错误后的代码中,您可以检查上层更新中的代码片段。这对我来说很奇怪,但现在它运行良好:)

1 个答案:

答案 0 :(得分:2)

一种方法是在控制器中调用类似的东西:

if(Yii::app()->user->checkAccess('my_user_role')){ // Do something }

?匿名用户

@登录用户

*任何已登录的用户

admin也是用户名,在这种情况下不是用户类型

在您的情况下,您可以这样做:

array('allow',
'actions'=>array('create','update'),
'users'=>array('@'),
'roles'=>array('myRole')
),

users指定上述列表中的用户类型。然后,roles密钥允许您将特定角色分配给该组用户