Yii2 每个内容的可见性取决于角色

Yii2 per content visibility depending on role

我们已经使用 RBAC 为 CRUD 实现了简单的基于角色的权限,但现在我们还需要添加一个 'visibility' 功能,可以将内容可见性 (R) 限制为仅注册用户或仅内容所有者。

那么,我们如何限制不同级别的内容可见性,例如

实现这个的最佳方法是什么,RBAC 似乎没有直接的方法来处理这个问题。

你可以创建一个权限函数,运行 在每个函数中,将用户角色作为参数,returns true 或重定向到不允许的页面。

这是我尝试过的,但您可以根据需要进行修改。

public function allowUser($min_level) { 
        //-1 no login required 0..3: admin level
        $userRole = //get user role;
        $current_level = -1;
        if (Yii::$app->user->isGuest)
            $current_level = 0;
        else
            $current_level = userRole;
        if ($min_level > $current_level) {
            $this->redirect(array("/pages/not-allowed"),true);
        }
    }

我认为在模型中使用 defaultScope 可以解决问题。因此,在给出内容之前,我们可以检查用户数据的当前角色并给出必要的条件。

public static function find()
{
    $userRoleArray = \Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
    $userRole = current($userRoleArray)->name;

    if ($userRole == 'admin') {
        return parent::find()->where("Your condition");
    } elseif ($userRole == 'moderator') {
        return parent::find()->where("Your condition");
    }
}