Yii 框架的Rbac [权限控制]

转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451php

 

1.首先咱们要在配置文件的组件(component)里面配置一下 Rbachtml

[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默认数据表mysql

a.运行下面的命令生成权限数据表:web

yii migrate --migrationPath=@yii/rbac/migrations/
b.也能够打开vendor\yiisoft\yii2\rbac\migrations\schema-MySQL.sql 拷贝里面的内容到数据库运行生成数据表sql


3.添加角色和权限数据库

a.建立权限yii2

[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.建立角色app

[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为权限yii

[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值不一样)post


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],去掉权限和用户关联,添加权限和角色的上下级关联

将角色赋给用户

检测权限

效果于上面保持一致

相关文章
相关标签/搜索