Yii2-admin RBAC权限管理的实现

时间:2022-10-05 08:41:25

yii2-admin是yii2 rbac的一套管理工具,实现了漂亮的界面和完整的权限管理功能,不用自己再去写权限代码了,使用之前请将yii2的源码更新到最新版本.

git源码地址:https://github.com/mdmsoft/yii2-admin

安装yii2-admin:

1、首先切换到项目目录下

2、执行该语句:composer.phar require mdmsoft/yii2-admin

注:如果提示could not open input file composer.phar

请先执行下面两条语句

composer self-update
composer install --prefer-dist

3、composer完成后在项目下的配置文件中加入下列配置项

Yii2-admin RBAC权限管理的实现
'aliases' => [ 
'@mdm/admin' => '$PATH\yii2-admin-1.0.3',
]
,
'modules' => [
'admin' => [
'class' => 'mdm\admin\Module',

'layout' => 'left-menu', // it can be '@path/to/your/layout'.
/**/
'controllerMap' => [
'assignment' => [
'class' => 'mdm\admin\controllers\AssignmentController',
'userClassName' => 'app\models\User',
'idField' => 'id'
]
]
,
'menus' => [
'assignment' => [
'label' => 'Grand Access' // change label
],
//'route' => null, // disable menu route
]
]
,
'debug' => [
'class' => 'yii\debug\Module',
]
,
]
,
Yii2-admin RBAC权限管理的实现
Yii2-admin RBAC权限管理的实现
components数组中加入authManager组件,有PhpManager和DbManager两种方式,PhpManager将权限关系保存在文件里,这里使用的是DbManager方式,将权限关系保存在数据库.  

'authManager' => [
'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'
],
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages', // if advanced application, set @frontend/messages
'sourceLanguage' => 'en',
'fileMap' => [
//'main' => 'main.php',
],
]
,
]
,
]
,
Yii2-admin RBAC权限管理的实现

4.命令行切换到yii2目录,执行下面命令,创建rbac需要的表(需自行创建数据库,库名默认yii2basic)
    yii migrate --migrationPath=@yii/rbac/migrations
    yii migrate --migrationPath=@mdm/admin/migrations (创建menu导航菜单表),如果发生错误可以将migrations中的sql文件移动到@yii/rbac/migrations目录下生成表
上面的命令使用的yii2框架的cli模式,所以需要将上面的配置,在console.php中也写一份,这个大家看错误提示就知道了.

 

反正这步我是没有执行成功的,这步的目的是在数据库里生成下面5个表:

menu
auth_rule            //规则,规则类名
auth_item_child    //角色对应的权限,parent角色,child权限名
auth_item            //角色|权限表,type=1角色,type=2权限
auth_assignment    //角色与用户对应关系表

我通过下面SQL语句直接生成这5个表

Yii2-admin RBAC权限管理的实现
SET FOREIGN_KEY_CHECKS=0; 

-- ----------------------------
--
Table structure for yc_menu
--
----------------------------
DROP TABLE IF EXISTS `yc_menu`;
CREATE TABLE `yc_menu` (
`id`
int(11) NOT NULL AUTO_INCREMENT,
`name`
varchar(128) NOT NULL,
`parent`
int(11) DEFAULT NULL,
`route`
varchar(256) DEFAULT NULL,
`
order` int(11) DEFAULT NULL,
`data`
text,
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `name` (`name`),
KEY `route` (`route`(255)),
KEY `order` (`order`),
CONSTRAINT `dh_menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `dh_menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE
=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统管理员菜单权限表\r\n';

DROP TABLE IF EXISTS `yc_auth_rule`;
CREATE TABLE `yc_auth_rule` (
`name`
varchar(64) NOT NULL,
`data`
text,
`created_at`
int(11) DEFAULT NULL,
`updated_at`
int(11) DEFAULT NULL,
PRIMARY KEY (`name`),
KEY `name` (`name`),
KEY `created_at` (`created_at`),
KEY `updated_at` (`updated_at`)
) ENGINE
=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员权限规则表';

DROP TABLE IF EXISTS `yc_auth_item_child`;
CREATE TABLE `yc_auth_item_child` (
`parent`
varchar(64) NOT NULL,
`child`
varchar(64) NOT NULL,
PRIMARY KEY (`parent`,`child`),
KEY `child` (`child`),
KEY `parent` (`parent`)
) ENGINE
=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员权限关系表';

DROP TABLE IF EXISTS `yc_auth_item`;
CREATE TABLE `yc_auth_item` (
`name`
varchar(64) NOT NULL,
`type`
int(11) NOT NULL,
`description`
text,
`rule_name`
varchar(64) DEFAULT NULL,
`data`
text,
`created_at`
int(11) DEFAULT NULL,
`updated_at`
int(11) DEFAULT NULL,
PRIMARY KEY (`name`),
KEY `rule_name` (`rule_name`),
KEY `type` (`type`),
KEY `name` (`name`),
KEY `created_at` (`created_at`),
CONSTRAINT `yc_auth_item_ibfk_2` FOREIGN KEY (`rule_name`) REFERENCES `yc_auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE
=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理权权限条目';

DROP TABLE IF EXISTS `yc_auth_assignment`;
CREATE TABLE `yc_auth_assignment` (
`item_name`
varchar(64) NOT NULL,
`
user_id` varchar(64) NOT NULL,
`created_at`
int(11) DEFAULT NULL,
PRIMARY KEY (`item_name`,`user_id`),
KEY `user_id` (`user_id`),
KEY `created_at` (`created_at`),
KEY `item_name` (`item_name`),
CONSTRAINT `yc_auth_assignment_ibfk_2` FOREIGN KEY (`item_name`) REFERENCES `yc_auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE
=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员授权表';
Yii2-admin RBAC权限管理的实现

5.访问管理界面,http://localhost/admin,这时由于没有数据,会报错,我们需要添加用户表user
我的字段是这样的,只需存在user_id即可,其他字段根据需要自行增减

Yii2-admin RBAC权限管理的实现
CREATE TABLE `user` ( 
`
user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username`
varchar(16) DEFAULT NULL,
`password`
varchar(32) DEFAULT NULL,
`realname`
varchar(32) DEFAULT NULL,
`email`
varchar(32) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE
=InnoDB DEFAULT CHARSET=utf8;
Yii2-admin RBAC权限管理的实现

这是访问可能还会报错,因为我们没有实现验证类,在配置文件web.php中的components加入user项

'user' => [ 
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
]
,

这里的app\models\User是我们实现的验证类,你可以随便取名

class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface 
这个类需实现IdentityInterface接口中的5个函数
,必须实现的有2个方法
findIdentity(
$id) //根据id查询用户信息
getId() //获取用户id

到这里,基本就完成了,访问http://localhost/admin,即可看到管理界面

6.使用

1)修改导航菜单模板主视图文件 views/layouts/main.php

Yii2-admin RBAC权限管理的实现
use mdm\admin\components\MenuHelper;  
use yii\bootstrap\Nav;

echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right nav-pills '],
#修改使用yii2-admin的菜单控制项
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id),
]);
Yii2-admin RBAC权限管理的实现

2)进入yii2-admin的目录,vi components/MenuHelper.php

public static function getAssignedMenu($userId, $root = null, $callback = null, $refresh = true) 将$refresh改为true  

3)添加导航菜,创建RULE, 创建角色

https://github.com/mdmsoft/yii2-admin/blob/master/docs/guide/basic-usage.md

创建RULE时,必须写一个类并继承yii\rbac\Rule,并且实现其抽象方法。

A PHPer and a Linuxer