思路解说:
首先,我们约定以Controller/Action这样的格式作为有效的权限名称,直接将权限赋给用户,最后在can这个方法中做校验。为了不破坏源码,我们可以在ActiveRecord之前加一层基础控制器BaseController,普通控制器继承BaseController。
方案一
创建权限:
那么我们建立对应的权限数据(如何创建在RBAC第二篇中已经详细讲解)
权限post/detail:文章详情页的权限
权限赋给用户:
将权限直接赋给用户(此处用户ID为1)
检测权限:
在基础控制器中的beforeAction中验证权限:
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
$controller = Yii::$app->controller->id;
$action = Yii::$app->controller->action->id;
$permissionName = $controller.'/'.$action;
if(!\Yii::$app->user->can($permissionName) && Yii::$app->getErrorHandler()->exception === null){
throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
}
return true;
}
注意:
Yii::$app->getErrorHandler()->exception === null
这个必须要加,不然会报错,至于为什么就不多说了,简称一言难尽,V_V
方案二(代码就不赘述了跟上面差不多)
权限赋给角色,角色赋给用户
创建角色:
还是之前的权限[post/detail],去掉权限和用户关联,添加权限和角色的上下级关联
将角色赋给用户
检测权限
效果于上面保持一致