Yii框架RBAC功能
数据表结构
用户表adminuser
权限表 auth_item
用户角色表auth_assignment
角色权限表auth_item_child
这段代码直接控制的是游客或者认证用户
public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], //这里是设定的权限---start 'access'=>[ 'class' => AccessControl::className(), //这里一定要注意rules的一个[]里面是包了两个[],如果写错了会报错 'rules' => [ // [ // 'actions' => ['index','view'],//动作 // 'allow' => true, // 'roles' => ['?'],// 这里的问号代表的是没有经过认证的游客用户 // ], [ 'actions' => ['view','index','create','update'],//动作 'allow' => true, 'roles' => ['@'],//这里的符号指的是经过认证的正式用户 ], ], ], //好了,设定权限结束了---end ]; }
这段代码控制用户有没有这个权限
public function actionIndex() { if(!Yii::$app->user->can('commentAuditor')){ throw new ForbiddenHttpException('对不起,您没有操作权限!');//这句话的意思是如果没有这个权限就抛出异常提示(注意要引用相关的ForbiddenHttpException类) } $searchModel = new CommentSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); }
***************************************************************************************************************************************************************************
为了让最高管理才能操作管理员的选项我在登录的时候加了这个
public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new AdminLoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { //自己加的为了权限判断 start $AuthAssignments = AuthAssignment::find()->select(['item_name'])->where(['user_id'=>Yii::$app->user->id])->orderBy('item_name')->all(); $AuthAssignmentsArray = array(); foreach ($AuthAssignments as $AuthAssignment){ array_push($AuthAssignmentsArray,$AuthAssignment->item_name); } if(in_array('admin',$AuthAssignmentsArray)){ Yii::$app->session['user_role']='666';//最高管理 }else{ Yii::$app->session['user_role']='999';//最高管理之外的 } //end 这一段就是为了控制最高管理员有分配角色权限,其他人登录以后没有 return $this->goBack(); } else { return $this->render('login', [ 'model' => $model, ]); } }
然后可以控制它
public function behaviors() { if(Yii::$app->session['user_role']=='666'){ return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], //这里是设定的权限---start 'access'=>[ 'class' => AccessControl::className(), //这里一定要注意rules的一个[]里面是包了两个[],如果写错了会报错 'rules' => [ // [ // 'actions' => ['index','view'],//动作 // 'allow' => true, // 'roles' => ['?'],// 这里的问号代表的是没有经过认证的游客用户 // ], [ 'actions' => ['view','index','create','update','resetpwd','privilege'],//动作 'allow' => true, 'roles' => ['@'],//这里的符号指的是经过认证的正式用户 ], ], ], //好了,设定权限结束了---end ]; }else{ return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], //这里是设定的权限---start 'access'=>[ 'class' => AccessControl::className(), //这里一定要注意rules的一个[]里面是包了两个[],如果写错了会报错 'rules' => [ // [ // 'actions' => ['index','view'],//动作 // 'allow' => true, // 'roles' => ['?'],// 这里的问号代表的是没有经过认证的游客用户 // ], [ 'actions' => ['view','index','create','update'],//动作 'allow' => true, 'roles' => ['@'],//这里的符号指的是经过认证的正式用户 ], ], ], //好了,设定权限结束了---end ]; } }
其实也不用这么麻烦,直接在index展示那里判断,不是最高权限就不让显示页面就可以
public function actionIndex() { if(!Yii::$app->user->can('admin')){ throw new ForbiddenHttpException('对不起,您没有操作权限!');//这句话的意思是如果没有这个权限就抛出异常提示(注意要引用相关的类) } $searchModel = new AdminuserSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); return $this->render('index', [ 'searchModel' => $searchModel, 'dataProvider' => $dataProvider, ]); }
*************************************************************************************************************************************************************************************
其实也没什么 就是建表把逻辑搞清楚了就完事了!
通往牛逼的路上,在意的只有远方!