johnny1991 2017-04-12 12:06:18 7421次浏览 5条评论 15 5 0

权限设置
公司角色:销售,项目经理,人事,老板
公司成员:小销是销售,小项是项目经理,小李是人事,老雷是老板
系统里面有menu:客户管理,项目管理,人事管理
需求描述:销售客户访问客户管理,项目经理可以访问项目管理,人事可以访问人事管理,老板都可以访问
实现过程:
第一步:生成rbac相关的表(mysql为例)

/**
 * Database schema required by \yii\rbac\DbManager.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @author Alexander Kochetov <creocoder@gmail.com>
 *  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到此就结束了,是不是很简单呢?

觉得很赞
您需要登录后才可以评论。登录 | 立即注册