[置顶] (十二) yii2 rbac使用DbManager来实现后台的权限判断
来源:程序员人生 发布时间:2015-04-17 08:58:16 阅读次数:5270次
我用的是yii2的高级利用版本 (下载地址)
yii2 的分两种1种是PhpManager,另外1种就是DbManager了
我下面用到的就是DbManager
第1步、配置你的mian.php
具体配置自己看yii的官网文档吧: 文档
return [
// ...
'components' => [
'authManager' => [
'class' => 'yii
bacDbManager',
],
// ...
],
];
第2步、生成数据表
yii migrate --migrationPath=@yii/rbac/migrations
如果不行在yii 前面增加php
数据库已生成数据了有4个表
auth_assignment: 用户角色表
auth_item_child: 角色跟权限关联表
auth_item: 保存角色或权限
auth_rule: 规则表(目前我没有用到)
第3步、生成model
在gii中生成这个4个表的model,但是还要增加两个model才行
复制item稍作修改就行了,命名方式你们自己定。下面是我自己命名的:
RoleForm.php
PermissionForm.php
在官网文档上可以看到yii-rbac-Role隐藏继承的常量以下:
TYPE_PERMISSION 默许值 2
TYPE_ROLE 默许值 1
都定义在: yii
bacItem(你们看文档rbac中的Role最底下就是咯)
</pre><pre name="code" class="php">由于这两个model都是对auth_item表进行数据操作所以呢我们这两个model只要继承于AuthItem.php(也就是用gii对auth_item表成后的那个文件)然后修改下我们刚才多加的两个model(RoleForm, PermissionForm)
第4步、修改RoleForm.php、PermissionForm.php
RoleForm.php内容以下:
class RoleForm extends AuthItem
{
public $child;//这个是用来放权限的
public function init() {
parent::init();
//常量TYPE_ROLE=1
$this->type = Item::TYPE_ROLE;
}
}
PermissionForm.php 内容以下:
class PermissionForm extends AuthItem
{
public function init() {
parent::init();
//常量TYPE_PERMISSION=2
$this->type = Item::TYPE_PERMISSION;
}
}
第5步、创建对应的controller
控制器命名根据你们自己习惯
首先说下PermissionController(用于权限管理)
表单提交时auth_item表中的name、type不要空了就好
然后我们实例化rbac中的Permission
use yii
bacPermission; 记得带上它
$permission = new Permission();
在将表单数据进行赋值
$permission->name = $model->name;
$permission->type = $model->type;
//这里将权限添加到auth_item中
$bool =
Yii::$app->authManager->add( $permission );
有了权限自然少不了RoleController(用于角色管理)
use yii
bacRole;
$role = new Role();
$role->name = $model->name;
$role->type = $model->type;
$bool = $this->authManager->add( $role );
不同的是我们要给角色赋予我们所创建的角色对吧也就是在RoleForm中所添加的$child这个变量
这个时候我们要进行两步操作
(1)
//权限列表
$permissions =
Yii::$app->authManager->getPermissions();
$perArr = array();
foreach ($permissions as $key => $value) {
$perArr[$value->name] = $value->name;
}
//添加角色的时候同时赋予权限,所以权限列表就是为了给角色添加权限
(2)
//表单提交落后行权限写入
foreach ( $child as $val) {
//获得权限
$childObj =
Yii::$app->authManager->getPermission($val);
//给item_child写入数据(权限表)
Yii::$app->authManager->addChild( $role, $childObj );
}
最后就是给所创建的角色分配给用户了AssignMentController
//获得角色对象
$role =
Yii::$app->authManager->getRole( $model->item_name );
//assign参数 角色对象, 用户id
$bool =
Yii::$app->authManager->assign( $role, $userId );
第6步、检查用户是不是有权限操作
创建1个控制器用于controllers下需要判断权限的控制器都继承于这个基类
BaseController是我自己写的,这个你们自己可以命名其他。。。
class BaseController extends Controller
public function init() {
parent::init();
//用户id
$userId =
Yii::$app->user->getId();
//权限规则逻辑…..
$permission = ‘这个是你权限规则逻辑得出的的结果';
if ( !
Yii::$app->authManager->checkAccess( $userId , $permission ) ) {
throw new CHttpException(403, '没有权限访问');
}
}
}
好吧,忙了1天删除修改都没有时间写,写出来了在进行更新!!!
希望能给大家帮助!!!谢谢大家!!不喜勿喷!!!!
转载请说明出处: 指尖上的艺术家 http://blog.csdn.net/arthuralston2015/article/details/44969867
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠