最简单rbac实现方法 [ 2.0 版本 ]
权限设置
公司角色:销售,项目经理,人事,老板
公司成员:小销是销售,小项是项目经理,小李是人事,老雷是老板
系统里面有menu:客户管理,项目管理,人事管理
需求描述:销售客户访问客户管理,项目经理可以访问项目管理,人事可以访问人事管理,老板都可以访问
实现过程:
第一步:生成rbac相关的表(mysql为例)
/**
* Database schema required by \yii\rbac\DbManager.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Alexander Kochetov <creocoder@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
* @since 2.0
*/
drop table if exists `auth_assignment`;
drop table if exists `auth_item_child`;
drop table if exists `auth_item`;
drop table if exists `auth_rule`;
create table `auth_rule`
(
`name` varchar(64) not null,
`data` text,
`created_at` integer,
`updated_at` integer,
primary key (`name`)
) engine InnoDB;
create table `auth_item`
(
`name` varchar(64) not null,
`type` integer not null,
`description` text,
`rule_name` varchar(64),
`data` text,
`created_at` integer,
`updated_at` integer,
primary key (`name`),
foreign key (`rule_name`) references `auth_rule` (`name`) on delete set null on update cascade,
key `type` (`type`)
) engine InnoDB;
create table `auth_item_child`
(
`parent` varchar(64) not null,
`child` varchar(64) not null,
primary key (`parent`, `child`),
foreign key (`parent`) references `auth_item` (`name`) on delete cascade on update cascade,
foreign key (`child`) references `auth_item` (`name`) on delete cascade on update cascade
) engine InnoDB;
create table `auth_assignment`
(
`item_name` varchar(64) not null,
`user_id` varchar(64) not null,
`created_at` integer,
primary key (`item_name`, `user_id`),
foreign key (`item_name`) references `auth_item` (`name`) on delete cascade on update cascade
) engine InnoDB;
第二步:配置authManager的组件
'authManager' => [
'class' => 'yii\rbac\PhpManager',
],
第三步:生成角色
$authManager = Yii::$app->authManager;
$ceo = $authManager->createRole('ceo');
$authManager->add($ceo);
$humanresource = $authManager->createRole('humanresource');
$authManager->add($humanresource);
$projectmanager = $authManager->createRole('projectmanager');
$authManager->add($projectmanager);
$sales = $authManager->createRole('sales');
$authManager->add($sales);
// 并且建立好等级关系,ceo是sales,projectmanager,humanresource的上司
$authManager->addChild($ceo, $sales);
$authManager->addChild($ceo, $projectmanager);
$authManager->addChild($ceo, $humanresource);
第三步:建立相关权限
$auth = Yii::$app->authManager;
$HumanResourceMenu = $auth->createPermission('HumanResourceMenu');
$auth->add($HumanResourceMenu);
$customerMenu = $auth->createPermission('customerMenu');
$auth->add($customerMenu);
$projectManagerMenu = $auth->createPermission('projectManagerMenu');
$auth->add($projectManagerMenu);
第四步:将相关的权限分配给相关的角色
$authManager->addChild($sales, $customerMenu);
$authManager->addChild($projectmanager, $projectManagerMenu);
$authManager->addChild($humanresource, $HumanResourceMenu);
到此为止,rbac的权限已经完全配置好了,剩下的事情就是给每个人分配相关的角色即可了
第五部:每个人分配相关的角色
将小销分配一个sales角色,小项分配一个projectmanager的角色,小李分配一个humanresource的角色,老雷分配一个ceo的角色
$authManager->assign($ceo,$userId); // 老雷的userId,
$authManager->assign($humanresource,$userId); // 小李的userId,
...以此类推
rbac权限系统已经构建完成,剩下的事情就是使用了
第六步:使用rbac
<?php if(Yii::$app->getUser->can('customerMenu')):?>
客户管理
<?php endif;?>
<?php if(Yii::$app->getUser->can('projectManagerMenu')):?>
项目管理
<?php endif;?>
<?php if(Yii::$app->getUser->can('HumanResourceMenu')):?>
人事管理
<?php endif;?>
rbac到此就结束了,是不是很简单呢?
johnny1991
注册时间:2017-03-26
最后登录:2024-03-05
在线时长:81小时27分
最后登录:2024-03-05
在线时长:81小时27分
- 粉丝26
- 金钱3285
- 威望580
- 积分9895
热门源码
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- 整合完 yii2-rbac+yii2-admin+adminlte 等库的基础开发后台源码
- 适合初学者学习的一款通用的管理后台
- yii-goaop - 将 goaop 集成到 Yii,在 Yii 中优雅的面向切面编程
- yii-log-target - 监控系统异常且多渠道发送异常信息通知
- 店滴云1.3.0
- 面向对象的一小步:添加 ActiveRecord 的 Scope 功能
- Yii2 开源商城 FecShop
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统
共 5 条评论
学习了,赞一个
Mark,学习下。 。 。 。
修正一下第二步,
'authManager' => [ 'class' => 'yii\rbac\DbManager', ],
好 赞一下
菜鸡想问一下这几步分别在什么平台上写,最后怎么整合的丫