下面介绍一个 yii2.0 的 Rbac 权限设置: 

一、首先我们要在 组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main.php)。


'authManager' => [
   'class' => 'yii\rbac\DbManager',
   'itemTable' => 'auth_item',
   'assignmentTable' => 'auth_assignment',
   'itemChildTable' => 'auth_item_child',
],

当然,在配置里面也可以设置 默认角色,只是我没写。Rbac 支持两种类,PhpManager 和 DbManager ,这里我使用 DbManager 。

yii migrate --migrationPath=@yii/rbac/migrations/

运行此命令生成权限数据表 

二、 yii2.0 的 Rbac 权限数据表结构

yii2_auth_item  角色权限表,添加角色权限。
yii2_auth_item_child  角色权限关联表,给角色添加权限。
yii2_yii2_auth_rule  规则表,添加规则。
yii2_auth_assignment  用户角色表,给用户添加角色
yii2_user  用户表,创建用户

三、角色权限表增删改查,主要是操作yii2_auth_item数据表

/*
    * 创建权限
    * yii2_auth_item  角色权限表
    */
   public function createPermission($item){
       $auth=Yii::$app->authManager;
       $createPost=$auth->createPermission($item);
       $createPost->description='创建了'.$item.'许可';
       if($auth->add($createPost)){
           return true;
       }else{
           return false;
       }
   }
   /**
    * 删除“权限”
    * 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
    * @param string $role 角色名称
    */
   public function deletePermission($item){
       $role = Yii::$app->authManager->getPermission($item);
       if (Yii::$app->authManager->remove($role)) {
           return $this->redirect(['index']);
       }else{
           Yii::$app->session->setFlash('error','删除失败');
       }
   }
   /**
    * 更新“权限”
    * 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
    * @return bool
    */
   public function updatePermission($item,$newItem){
       $permission = Yii::$app->authManager->getPermission($item);
       $permission->name=$newItem;
       if (Yii::$app->authManager->update($item,$permission)) {
           return true;
       }else{
           return false;
       }
   }
   /*
    * 创建角色
    * yii2_auth_item  角色权限表
    */
   public function createRole($item){
       $auth=Yii::$app->authManager;
       $role=$auth->createRole($item);
       $role->description='创建了'.$item.'角色';
       if($auth->add($role)){
           return true;
       }else{
           return false;
       }
   }

   /**
    * ---------------------------------------
    * 编辑“角色”
    * 注意:角色表的“rule_name”字段必须为“NULL”,不然会出错。
    *      详情见“yii\rbac\BaseManager”的203行if($item->ruleName === null){return true;}
    * ---------------------------------------
    */
   public function actionUpdate($role){
       /* 获取角色信息 */
       $model=$this->findModel($role);
       //$item_name = Yii::$app->request->get('role');
       $roled = Yii::$app->authManager->getRole($role);
       if (Yii::$app->request->isPost) {
           $data=Yii::$app->request->post();
           $item=$data['AuthItemModel']['name'];
           if($model->load($data)&&$model->validate()) {
               $roled->name=$item;
               $roled->description='创建了'.$item.'角色';
               if (Yii::$app->authManager->update($role, $roled)) {
                   Yii::$app->session->setFlash('success', '更新成功');
               } else {
                   Yii::$app->session->setFlash('error', '更新失败');
               }
           }
       }
       return $this->render('update',[
           'model'=>$model
       ]);
   }
   /**
    * 删除“角色”
    * 同时会删除auth_assignment、auth_item_child、auth_item中关于$role的内容
    * @param string $role 角色名称
    */
   public function actionDelete($role){
       $role = Yii::$app->authManager->getRole($role);
      // print_r($role);exit;
       if (Yii::$app->authManager->remove($role)) {
          return $this->redirect(['index']);
       }else{
           Yii::$app->session->setFlash('error','删除失败');
       }
   }

四、角色权限关联表增删改查,主要是操作yii2_auth_item_child数据表


   /*
    * 给角色分配权限
    *  yii2_auth_item_child  角色权限关联表
    */
   public function createEmpowerment($item1,$item2){
       $auth=Yii::$app->authManager;
       $parent=$auth->createRole($item1);
       $child=$auth->createPermission($item2);
       $auth->addChild($parent,$child);
   }
   /**
    * ---------------------------------------
    * 角色授权
    * ---------------------------------------
    */
   public function actionAuth($role){
       //print_r(Yii::$app->authManager->getRolesByUser(Yii::$app->user->identity->id));exit;
       if(Yii::$app->request->isPost){
           $data=array_unique(Yii::$app->request->post());
           /* 删除角色所有child */
           $parent=Yii::$app->authManager->getRole($role);
           Yii::$app->authManager->removeChildren($parent);
           foreach($data as $k=>$v){
               if($k!='_csrf-backend'){
                   $this->createEmpowerment($role,$v);
               }
           }
           Yii::$app->session->setFlash('success', '添加成功');
           //print_r($data);exit;
       }
       $menu=MenuModel::find()->asArray()->all();
       $arr=TreeHelper::getTreeAsArray($menu,$pid=0);
       $auth_permission=Yii::$app->authManager->getChildren($role);
       return $this->render('auth',[
           'menuArr'=>$arr,
           'auth_permission'=>$auth_permission
       ]);
   }

五、用户角色表增删改查,主要是操作yii2_auth_assignment数据表

/*
    * 用户添加角色
    * auth_assignment  用户角色表
    */
   public function createAssign($item1,$item2){
       $auth=Yii::$app->authManager;
       $role=$auth->createRole($item1);
       $auth->assign($role,$item2);
   }
    /**
    * 用户角色更新
    */
   public function actionUserRole($id){
       if(Yii::$app->request->isPost){
           $data=Yii::$app->request->post();
           $item_name = $data['param'];
           Yii::$app->authManager->revokeAll($id);
           $this->createAssign($item_name,$id);
           Yii::$app->session->setFlash('success', '更新成功');
       }
       $roles=Yii::$app->authManager->getRoles();
       $group = array_keys(Yii::$app->authManager->getAssignments($id));
       return $this->render('userrole',[
           'roles'=>$roles,
           'group' => $group,
           'id'=>$id
       ]);
   }
   /**
    * 用户角色删除
    */
   public function actionUserRoleDelete($id,$role){
       $role_item=Yii::$app->authManager->getRole($role);
       if(Yii::$app->authManager->revoke($role_item,$id)){
           return $this->redirect(['auth/index']);
       }else{
           Yii::$app->session->setFlash('error','删除失败');
           return $this->render('user');
       }

   }

6、控制器中验证权限

public function beforeAction($action)
{
   $action = Yii::$app->controller->action->id;
   if(\Yii::$app->user->can($action)){
       return true;
   }else{
       throw new \yii\web\UnauthorizedHttpException('对不起,您现在还没获此操作的权限');
   }
}
public function beforeAction($action)
   {
       if (!Yii::$app->user->isGuest) {
           $name=Yii::$app->authManager->getRolesByUser(Yii::$app->user->identity->id);
           $bool=false;
           foreach($name as $k=>$v){
               $roleName=$k;
               $parent=Yii::$app->authManager->getRole($roleName);
               $action = Yii::$app->controller->action->id;
               $controller=Yii::$app->controller->id;
               $item2=$controller.'/'.$action;
               $child=Yii::$app->authManager->createPermission($item2);
               if(Yii::$app->authManager->hasChild($parent,$child)){
                   $bool=true;
               }
           }
           if(!$bool){
               throw new \yii\web\UnauthorizedHttpException('您现在还没获此操作的权限');
           }else{
               return true;
           }
//        if(\Yii::$app->user->can($action)){
//            return true;
//        }else{
//            throw new \yii\web\UnauthorizedHttpException('您现在还没获此操作的权限');
//        }
       }else{
           Yii::$app->user->loginRequired();
       }
   }

上一篇:wamp怎么配置虚拟主机

下一篇:npm命令