Yii 框架的Rbac [權限控制]


轉載自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451

 

1.首先我們要在配置文件的組件(component)里面配置一下 Rbac

[php]  view plain  copy

 

  1. ‘authManager’ => [
  2.      ‘class’ => ‘yii\rbac\DbManager’,
  3.      ‘itemTable’ => ‘auth_item’,
  4.      ‘assignmentTable’ => ‘auth_assignment’,
  5.      ‘itemChildTable’ => ‘auth_item_child’,
  6. ],

2.生成rbac默認數據表

a.運行下面的命令生成權限數據表:

yii migrate --migrationPath=@yii/rbac/migrations/
b.也可以打開vendor\yiisoft\yii2\rbac\migrations\schema-MySQL.sql 拷貝里面的內容到數據庫運行生成數據表


3.添加角色和權限

a.創建權限

[php]  view plain  copy

 

  1. public function createPermission($name)
  2. {
  3.     $auth = Yii::$app->authManager;
  4.     $createPost = $auth->createPermission($name);
  5.     $createPost->description = ‘創建了 ‘ . $name. ‘ 權限’;
  6.     $auth->add($createPost);
  7. }

b.創建角色

[php]  view plain  copy

 

  1. public function createRole($name)
  2. {
  3.     $auth = Yii::$app->authManager;
  4.     $role = $auth->createRole($name);
  5.     $role->description = ‘創建了 ‘ . $name. ‘ 角色’;
  6.     $auth->add($role);
  7. }

以上兩條添加,會創auth_item表中創建兩條記錄,以表中的type類型作為區分,type=1是角色,type=2為權限

[php]  view plain  copy

 

  1.     public function add($object)
  2.     {
  3.         if ($object instanceof Item) {
  4.             return $this->addItem($object);
  5.         } elseif ($object instanceof Rule) {
  6.             return $this->addRule($object);
  7.         } else {
  8.             throw new InvalidParamException(“Adding unsupported object type.”);
  9.         }
  10.     }

add方法會根據你傳入的對象屬性進行添加(添加角色和權限都是addItem,因為createPermission和createRole都創建了一個Item對象,只是對象中的type值不同)


4.添加用戶、角色和權限之間的關系

a.將權限賦給角色

[php]  view plain  copy

 

  1. public function addChild($items)
  2. {
  3.     $auth = Yii::$app->authManager;
  4.     $parent = $auth->createRole($items[‘role’]);                //創建角色對象
  5.     $child = $auth->createPermission($items[‘permission’]);     //創建權限對象
  6.     $auth->addChild($parent, $child);                           //添加對應關系
  7. }

注意:上面創建的角色和權限對象,必須已經在數據庫中創建,比如items[‘role’] = test,否則會報錯

b.將角色賦給用戶

[php]  view plain  copy

 

  1. public function addChild($items)
  2. {
  3.     $auth = Yii::$app->authManager;
  4.     $role = $auth->createRole($items[‘role’]);                //創建角色對象
  5.     $user_id = 1;                                             //獲取用戶id,此處假設用戶id=1
  6.     $auth->assign($role, $user_id);                           //添加對應關系
  7. }

5.驗證權限

[php]  view plain  copy

 

  1. public function beforeAction($action)
  2. {
  3.     $action = Yii::$app->controller->action->id;
  4.     if(\Yii::$app->user->can($action)){
  5.         return true;
  6.     }else{
  7.         throw new \yii\web\UnauthorizedHttpException(‘對不起,您現在還沒獲此操作的權限’);
  8.     }
  9. }

看下\Yii::$app->user->can()這個方法

[php]  view plain  copy

 

  1. public function can($permissionName, $params = [], $allowCaching = true)
  2. {
  3.     if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
  4.         return $this->_access[$permissionName];
  5.     }
  6.     $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
  7.     if ($allowCaching && empty($params)) {
  8.         $this->_access[$permissionName] = $access;
  9.     }
  10.     return $access;
  11. }

=============================================================

Yii2-權限控制RBAC-實例篇(三)

分類:

思路解說:

首先,我們約定以Controller/Action這樣的格式作為有效的權限名稱,直接將權限賦給用戶,最后在can這個方法中做校驗。為了不破壞源碼,我們可以在ActiveRecord之前加一層基礎控制器BaseController,普通控制器繼承BaseController。

方案一

創建權限:

那么我們建立對應的權限數據(如何創建在RBAC第二篇中已經詳細講解)

權限post/detail:文章詳情頁的權限

權限賦給用戶:

將權限直接賦給用戶(此處用戶ID為1)

檢測權限:

在基礎控制器中的beforeAction中驗證權限:

[php]  view plain  copy

 

  1. public function beforeAction($action)
  2. {
  3.     if (!parent::beforeAction($action)) {
  4.         return false;
  5.     }
  6.     $controller = Yii::$app->controller->id;
  7.     $action = Yii::$app->controller->action->id;
  8.     $permissionName = $controller.‘/’.$action;
  9.     if(!\Yii::$app->user->can($permissionName) && Yii::$app->getErrorHandler()->exception === null){
  10.         throw new \yii\web\UnauthorizedHttpException(‘對不起,您現在還沒獲此操作的權限’);
  11.     }
  12.     return true;
  13. }

注意:

[php]  view plain  copy

 

  1. Yii::$app->getErrorHandler()->exception === null

這個必須要加,不然會報錯,至於為什么就不多說了,簡稱一言難盡,V_V

方案二(代碼就不贅述了跟上面差不多)

權限賦給角色,角色賦給用戶

創建角色:

還是之前的權限[post/detail],去掉權限和用戶關聯,添加權限和角色的上下級關聯

將角色賦給用戶

檢測權限

效果於上面保持一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM