权限设置
公司角色:销售,项目经理,人事,老板
公司成员:小销是销售,小项是项目经理,小李是人事,老雷是老板
系统里面有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\DbManager',
],
第三步:生成角色
$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;?>