轉載自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451
1.首先我們要在配置文件的組件(component)里面配置一下 Rbac
- ‘authManager’ => [
- ‘class’ => ‘yii\rbac\DbManager’,
- ‘itemTable’ => ‘auth_item’,
- ‘assignmentTable’ => ‘auth_assignment’,
- ‘itemChildTable’ => ‘auth_item_child’,
- ],
2.生成rbac默認數據表
a.運行下面的命令生成權限數據表:
yii migrate --migrationPath=@yii/rbac/migrations/
b.也可以打開vendor\yiisoft\yii2\rbac\migrations\schema-MySQL.sql 拷貝里面的內容到數據庫運行生成數據表
3.添加角色和權限
a.創建權限
- public function createPermission($name)
- {
- $auth = Yii::$app->authManager;
- $createPost = $auth->createPermission($name);
- $createPost->description = ‘創建了 ‘ . $name. ‘ 權限’;
- $auth->add($createPost);
- }
b.創建角色
- public function createRole($name)
- {
- $auth = Yii::$app->authManager;
- $role = $auth->createRole($name);
- $role->description = ‘創建了 ‘ . $name. ‘ 角色’;
- $auth->add($role);
- }
以上兩條添加,會創auth_item表中創建兩條記錄,以表中的type類型作為區分,type=1是角色,type=2為權限
- public function add($object)
- {
- if ($object instanceof Item) {
- return $this->addItem($object);
- } elseif ($object instanceof Rule) {
- return $this->addRule($object);
- } else {
- throw new InvalidParamException(“Adding unsupported object type.”);
- }
- }
add方法會根據你傳入的對象屬性進行添加(添加角色和權限都是addItem,因為createPermission和createRole都創建了一個Item對象,只是對象中的type值不同)

4.添加用戶、角色和權限之間的關系
a.將權限賦給角色
- public function addChild($items)
- {
- $auth = Yii::$app->authManager;
- $parent = $auth->createRole($items[‘role’]); //創建角色對象
- $child = $auth->createPermission($items[‘permission’]); //創建權限對象
- $auth->addChild($parent, $child); //添加對應關系
- }
注意:上面創建的角色和權限對象,必須已經在數據庫中創建,比如items[‘role’] = test,否則會報錯
b.將角色賦給用戶
- public function addChild($items)
- {
- $auth = Yii::$app->authManager;
- $role = $auth->createRole($items[‘role’]); //創建角色對象
- $user_id = 1; //獲取用戶id,此處假設用戶id=1
- $auth->assign($role, $user_id); //添加對應關系
- }
5.驗證權限
- public function beforeAction($action)
- {
- $action = Yii::$app->controller->action->id;
- if(\Yii::$app->user->can($action)){
- return true;
- }else{
- throw new \yii\web\UnauthorizedHttpException(‘對不起,您現在還沒獲此操作的權限’);
- }
- }
看下\Yii::$app->user->can()這個方法
- public function can($permissionName, $params = [], $allowCaching = true)
- {
- if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
- return $this->_access[$permissionName];
- }
- $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
- if ($allowCaching && empty($params)) {
- $this->_access[$permissionName] = $access;
- }
- return $access;
- }
=============================================================
分類:
思路解說:
首先,我們約定以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],去掉權限和用戶關聯,添加權限和角色的上下級關聯

將角色賦給用戶

檢測權限
效果於上面保持一致
