Yii2的rbac怎么关联某一个具体的action,有人有例子吗?

echo_stone
  • 637

看到Yii::$app->authManager->createPermission('createPost')就可以创建createPost权限了;
然后再分配给某个用户,该用户就拥有这个权限了。
我认为'createPost'应该仅仅是权限的名字而已,事实上他也许对应一个logout操作(假设)。那么Yii怎么把权限和具体的action关联起来的呢?
是不是要配合AccessColtrol来使用呢?如果是,那要这个permission有什么意义呢?直接给role不就可以了?
求指教。3Q first~

回复
阅读 3.7k
3 个回答
✓ 已被采纳

正好做到做鉴权判断这块,我给你解答。

AccessColtrol 这种是一种形式

index、view 两个动作就是能通过AccessColtrol来判断了

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['index', 'view', 'create', 'update'],
            'rules' => [
                [
                    'actions' => ['index'], //来宾可见
                    'allow' => true,
                    'roles' => ['?'],
                ],
                [
                    'actions' => ['view', 'create', 'update'], //登录用户
                    'allow' => true,
                    'roles' => ['@'],
                ],
                [
                    'actions' => ['create', 'update'], //Post请求
                    'allow' => true,
                    'verbs' => ['POST']
                ],
            ],
        ],
    ];
}

public function actionIndex()
{
    return '来宾可见';
}

public function actionView()
{
    echo '登录用户可见:'."\n";
    return Yii::$app->user->identity->id;
}
  

使用Rbac,放在各自的方法里

优点是使用灵活,缺点是每次都要写相识的代码

public function actionCreate()
{
    if (Yii::$app->user->can('CreatePost')) {
        return '可以的';
    } else {
        throw new UnauthorizedHttpException('对不起,您现在还没获此操作的权限。');
    }
}

public function actionUpdate()
{
    if (Yii::$app->user->can('UpdatePost')) {
        return '可以的';
    } else {
        throw new UnauthorizedHttpException('对不起,您现在还没获此操作的权限。');
    }
}

使用Rbac,放在beforeAction这个方法里

正好跟上面一点相反,要根据请求的动作来判断哪个权限

public function beforeAction($action) {
    if (parent::beforeAction($action)) {
        //print_r($action); // 权限名字传递过去(CreatePost)
        if (!Yii::$app->user->can('CreatePost')) {
            throw new UnauthorizedHttpException(Yii::t('yii', '对不起,您现在还没获此操作的权限'));
        }
        return true;
    } else {
        return false;
    }
}

最后给你参考资料:http://www.yiichina.com/doc/guide/2.0/security-authorization

[该用户已被屏蔽]被屏蔽是什么意思啊?

Javascript局部变量有没有属性描述符

宣传栏