Yii2.0 RBAC 权限搭建
基于角色的存取控制 (RBAC)
基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制。 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅 Wikipedia。
具体请参阅 基于角色的存取控制
安装
代码语言:javascript复制composer create-project yiisoft/yii2-app-advanced advanced 2.0.14
生成默认用户表 User
代码语言:javascript复制php yii migrate
配置 RBAC
这里 我们使用 DbManager
.以高级版为例:在 commonconfigmain.php
中 配置 authManager
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
'components' => [
'authManager' => [
'class' => 'yiirbacDbManager',
],
]
生成对应的数据表
代码语言:javascript复制php yii migrate --migrationPath=@yii/rbac/migrations
执行以上命令会生成 4 张数据表
- itemTable: 该表存放授权条目(译者注:即角色和权限)。默认表名为 「auth_item」 。
- itemChildTable: 该表存放授权条目的层次关系。默认表名为 「auth_item_child」。
- assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为「auth_assignment」。
- ruleTable: 该表存放规则。默认表名为「auth_rule」 。
安装 yii2-admin
代码语言:javascript复制composer require mdmsoft/yii2-admin "~2.0"
生成数据表 menu
代码语言:javascript复制yii migrate --migrationPath=@mdm/admin/migrations
权限配置 打开 frontendconfigmain.php
添加如下配置:
'modules' => [
'admin' => [
'class' => 'mdmadminModule',
'layout' => 'left-menu',
],
],
'aliases' => [
'@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
],
'as access' => [
'class' => 'mdmadmincomponentsAccessControl',
'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
'authManager' => [
'class' => 'yiirbacDbManager',
],
]
好了,以上就完成 RBAC 的配置工作,并且可以食用啦
访问网址 http://localhost/frontend/admin
接下来谈谈 多个客户端如何配置 RBAC
什么意思呢? 业务场景是:假如你一个应用。并且该应用有多个管理端,
backend
、frontend
、api
,或者你还有其他客户端。每一个可客户端对应不同的认证类,不同的用户表,那么你的权限该如何控制呢?
我的第一想法是:在原有权限表的基础上进行操作。但最后想想还是算了......
那么第二种,我可不可以把权限表完全独立呢?比如 admin 是一套,api 是一套。答案是可行的。但是代价是数据库会多 5 张表。
具体实现步骤:
我们把 backend
目录 作为 后台管理, 我们先生成 admin_user
用户表
php yii migrate/create create_admin_user_table
编辑 consolemigrationsm****_create_admin_user_table.php
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->createTable('admin_user', [
'id' => $this->primaryKey(),
'username' => $this->string()->notNull()->unique(),
'auth_key' => $this->string(32)->notNull(),
'password_hash' => $this->string()->notNull(),
'password_reset_token' => $this->string()->unique(),
'email' => $this->string()->notNull()->unique(),
'status' => $this->smallInteger()->notNull()->defaultValue(10),
'created_at' => $this->integer()->notNull(),
'updated_at' => $this->integer()->notNull(),
]);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropTable('admin_user');
}
生成 admin_menu
菜单表(默认是 menu
,我们在上方已经使用数据迁移将他创建了) 我们还使用 数据迁移的方式进行创建
php yii migrate/create create_admin_menu_table
编辑生成的文件
代码语言:javascript复制 /**
* {@inheritdoc}
*/
public function safeUp()
{
$this->createTable('admin_menu', [
'id' => $this->primaryKey(),
'name' => $this->string(128),
'account' => $this->string(128),
'parent' => $this->string(11),
'route' => $this->string(256),
'order' => $this->integer(),
'data' => $this->text(),
]);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropTable('admin_auth');
}
执行 migrate
命令
php yii migrate
接下来生成 权限表,我们更改下commonconfigmain.php
的 authManager
组件
'authManager' => [
'class' => 'yiirbacDbManager',
'itemTable' => 'admin_auth_item',
'assignmentTable' => 'admin_auth_assignment',
'itemChildTable'=> 'admin_auth_item_child',
'ruleTable'=> 'admin_rule',
],
使用 migrate
生成权限表
php yii migrate --migrationPath=@yii/rbac/migrations
接着 ,我们再把 commonconfigmain.php
的 authManager
组件 还原
'authManager' => [
'class' => 'yiirbacDbManager',
],
修改 backendconfigmain.php
'modules' => [
'admin' => [
'class' => 'mdmadminModule',
'layout' => 'left-menu',
'controllerMap' => [
'assignment' => [
'class' => 'mdmadmincontrollersAssignmentController',
'userClassName' => 'backendmodelsAdminUser', #注意你需要生成此模型
],
],
],
],
'aliases' => [
'@mdm/admin' => '@vendor/mdmsoft/yii2-admin',
],
'as access' => [
'class' => 'mdmadmincomponentsAccessControl',
'allowActions' => ['*'], // 后面对权限完善了以后,记得把*改回来!
],
'components' => [
'authManager' => [
'class' => 'yiirbacDbManager',
'itemTable' => 'admin_auth_item',
'assignmentTable' => 'admin_auth_assignment',
'itemChildTable'=> 'admin_auth_item_child',
'ruleTable'=> 'admin_rule',
"defaultRoles" => ["guest"],
],
]
注意你需要自己生成对应的
AdminUser
模型类位置位于backendmodelsAdminUser.php
好了 还有最重要的一步需要设置,修改 backendconfigparams-local.php
<?php
return [
'mdm.admin.configs' => [
'menuTable' => 'admin_menu',
],
];
这样就完全独立于默认的权限表了 访问 http://localhost/backend/admin
以上就是Yii2.0 RBAC 权限的配置搭建。并没有教你如何使用,这方面的东西网上有很多,可以自行查阅。
灵感来源 我在 YiiChina 发布的一个问答: Yii2.0 如何实现多端RBAC权限管理