Authentication Yii2中的用户角色,来自DB值

Authentication Yii2中的用户角色,来自DB值,authentication,yii2,rbac,yii2-rbac,yii2-user-roles,Authentication,Yii2,Rbac,Yii2 Rbac,Yii2 User Roles,这听起来可能是重复的,但现有的答案不够清晰,不能解决我的问题 我有一个用户的数据库列表,一个元组如下所示 [ 'id' => '131', 'username' => 'mat', 'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191', 'authKey' => 'test100key', 'accessToken' => '1

这听起来可能是重复的,但现有的答案不够清晰,不能解决我的问题

我有一个用户的数据库列表,一个元组如下所示

[
        'id' => '131',
        'username' => 'mat',
        'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191',
        'authKey' => 'test100key',
        'accessToken' => '100-token',
        'role' => 'editor',
    ]
现在我想创建一个名为manager的用户类型,并在控制器中像这样设置访问控制

'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['create', 'view', 'index'], // Define specific actions
                    'allow' => true, // Has access
                    'roles' => ['editor'], // '@' All logged in users / or your access role e.g. 'admin', 'user'
                ],
                [
我试图以最少的麻烦来实现这一点,但我对yii/yii2不是很熟悉。RBAC实际上让我感到困惑,我发现很难理解文档

我只需要创建三种类型的用户角色。我了解如何控制对各种操作的访问


用户数据来自另一个应用程序将实时修改的表。

自己解决了这个问题。框架代码中的细微调整,我想如果我选择在任何一天更新Yii,我将面临麻烦

vendor/yiisoft/yii2/filters/AccessRule.php 编辑matchRole方法如下


根据您自己的回答,我发现您并不真正需要RBAC,只需检查用户的一个属性即可。您可以直接在控制器中执行此操作(而且无论如何,您都不能修改核心文件):

在控制器中添加:

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['create', 'view', 'index'],
            'rules' => [
                [
                    'allow' => true,
                    'matchCallback' => function ($rule, $action) {
                        return !\Yii::$app->user->isGuest 
                            && \Yii::$app->user->identity->role === 'editor';
                    },
                ],
            ],
        ],
    ];
}
matchCallback
是将被调用以确定是否应应用规则的回调。您需要首先检查用户是否为来宾,否则
Yii::$app->user->identity
null

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['create', 'view', 'index'],
            'rules' => [
                [
                    'allow' => true,
                    'matchCallback' => function ($rule, $action) {
                        return !\Yii::$app->user->isGuest 
                            && \Yii::$app->user->identity->role === 'editor';
                    },
                ],
            ],
        ],
    ];
}