RBAC实现(AdminLTE、yii-admin)

(一)—— 安装 yii2 和 composer

一、安装 yii2**

1、下载高级应用程序模板
2、新建数据库 advanced,然后新建 user 用户表

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT "自增ID",  
`username` varchar(255) NOT NULL COMMENT "用户名",  
`auth_key` varchar(32) NOT NULL COMMENT "自动登录key",  
`password_hash` varchar(255) NOT NULL COMMENT "加密密码",  
`password_reset_token` varchar(255) DEFAULT NULL COMMENT "重置密码token",  
`email` varchar(255) NOT NULL COMMENT "邮箱",  
`role` smallint(6) NOT NULL DEFAULT "10" COMMENT "角色等级",  
`status` smallint(6) NOT NULL DEFAULT "10" COMMENT "状态",  
`created_at` int(11) NOT NULL COMMENT "创建时间",  
`updated_at` int(11) NOT NULL COMMENT "更新时间",  
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT="用户表";

配置数据库文件 advanced/common/main-local.php
前台地址: 127.0.0.1/advanced/frontend/web/ ,进入前台后点击 Signup 注册用户
后台地址:127.0.0.1/advanced/backend/web,进入后台登录用户

二、安装 composer

1、Composer 是 PHP 的一个依赖管理工具,下载地址

下载之后直接运行进行安装,安装过程需要选择你的 php 可执行文件,如下图所示:

进入 cmd 输入 composer 查看是否安装成功,下图是安装成功界面

2、使用中国镜像:

① 进入 cmd,输入:

composer config -g repo.packagist composer https://packagist.phpcomposer.com

② 安装最新的Composer 资源插件:它是通过 Composer 管理 bower 和 npm 包所必须的,此命令全局生效,一劳永逸。
进入 cmd,输入:

composer global require "fxp/composer-asset-plugin:~1.1.1"

③ 注:更新 yii2 ,进入 cmd ,切换目录到 advanced,输入

composer update yiisoft/yii2 yiisoft/yii2-composer bower-asset/jquery.inputmask

(二)安装 AdminLTE 渲染后台和 yii2-admin 集成 rbac

一、安装 AdminLTE 渲染后台

1、利用 AdminLTE 渲染后台模板

AdminLTE 是一个完全响应管理模板。基于 Bootstrap3 框架,易定制模板。适合多种屏幕分辨率,从小型移动设备到大型台式机。内置了多个页面,包括仪表盘、邮箱、日历、锁屏、登录及注册、404错误、500错误等页面。

进入 cmd,切换到 advanced 目录,输入

composer require dmstr/yii2-adminlte-asset "2.*"

复制 vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app到 backend/views/,需要覆盖的则覆盖

2、进入后台 127.0.0.1/advanced/backend/web/ 查看效果

注释:如果遇到页面不断刷新,可能是因为加载资源的时候在获取 google 的 css 资源

解决办法:

①、下载谷歌字体,将压缩包解压至backend\web\css 目录下
②、在 backend\config\main.php 的 components 配置项中添加

'assetManager' => [
    'assetMap' => [
          'AdminLTE.min.css' => '@web/css/AdminLTE.min.css',
      ]
],
3、url 美化

① 配置:backend/config/main.php 文件的 compontents

"urlManager" => [
    //用于表明 urlManager 是否启用URL美化功能
    "enablePrettyUrl" => true,
    // 是否在URL中显示入口脚本
    "showScriptName" => false,
],

② 下载 .htaccess 文件,放在 backend/web 目录下(这是为了隐藏 Index.php,apache必须要开启rewrite模块)

二、安装 yii2-admin 集成 rbac**

1、yii2-admin 是 yii2 rbac 的一套管理工具,实现了漂亮的界面和完整的权限管理功能

进入 cmd,切换到 advanced 目录,输入

composer require mdmsoft/yii2-admin "2.x-dev"
2、配置 backend/config/main.php 文件
"modules" => [
    "admin" => [
        "class" => "mdm\admin\Module",
    ],
],
"aliases" => [
    "@mdm/admin" => "@vendor/mdmsoft/yii2-admin",
],
'as access' => [
    'class' => 'mdm\admin\components\AccessControl',
    'allowActions' => [
        //这里是允许访问的action
        //controller/action
    // * 表示允许所有,后期会介绍这个
        '*'
    ]
],
'components' => [
    "authManager" => [
        "class" => 'yii\rbac\DbManager',
        "defaultRoles" => ["guest"],
    ],
],
3、导入 rbac 表格

执行.sql 文件:vendor/yiisoft/yii2/rbac/migrations/schema-mysql.sql

4、运行 127.0.0.1/advanced/backend/web/admin/route 预览效果

(三) rbac 详细操作

1、下载 left.php 覆盖 backend/views/layouts/left.php

进入 127.0.0.1/advanced/backend/web/ 预览效果

2、点击“路由”,将下图中的几个路由移动到右边

image

查看 auth_item 数据表,发现新增了几行我们刚刚添加的记录


image

3、点击“权限”,然后点击 创建按钮进行创建权限

image

再次查看 auth_item 表,你会发现多了一条记录

创建成功之后来到权限的视图界面进行分配权限,将刚刚创建的全部路由分配给该权限

image

查看 auth_item_child 表,发现新增了四条记录,可以简单理解:auth_item_child 为权限分配了路由

4、点击“角色”,创建一个叫“站长”的角色

查看 auth_item 表,你会发现多了一条记录

此时你会发现,在 auth_item 表中,tyep=1表示角色、type=2表示权限。

创建成功之后来到角色的视图界面进行分配路由,将刚刚创建的“权限控制”分配给该角色

查看 auth_item_child 表,你会发现多了一条记录

可以简单理解:auth_item_child 为角色分配了权限

5、点击“分配”,然后点击当前用户的查看按钮,将“站长”这个角色分配给当前用户

查看 auth_assignment 表,你会发现多了一条记录

image

可以简单理解:auth_assignment 为用户分配了角色

(四)创建左侧导航栏菜单

1、创建 menu 表

CREATE TABLE `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`),  
CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `menu` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、在 left.php 的</ul>后面添加以下内容

<?php
      use mdm\admin\components\MenuHelper; 
    $callback = function($menu){
        $data = json_decode($menu['data'], true);
        $items = $menu['children'];
        $return = ['label' => $menu['name'],'url' => [$menu['route']]];
        //处理我们的配置
        if ($data) {
            isset($data['visible']) && $return['visible'] = $data['visible'];//visible
            isset($data['icon']) && $data['icon'] && $return['icon'] = $data['icon'];//icon
            //other attribute e.g. class...
            $return['options'] = $data;
        }
        //没配置图标的显示默认图标
        (!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o';
        $items && $return['items'] = $items;
        return $return;
    };
    //这里我们对一开始写的菜单menu进行了优化
    echo dmstr\widgets\Menu::widget( [
        'options' => ['class' => 'sidebar-menu tree','data-widget'=>'tree'],
        'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id,null, $callback),
    ] ); 
?>

3、点击“菜单”,然后点击 创建按钮进行创建菜单

4、点击“路由”,将以下几个路由写到 auth_item 表(为了分配路由给菜单)

点击“权限”,再点击查看“权限控制”,分配** /admin/menu/***

5、点击“菜单”,创建以下子菜单

注意:填写 “Parent” 即父级菜单的名称时要手动选择才行,直接全打上 会保存不了的。比如:先输入“权限”,然后出现下拉菜单就可以选择“权限控制”了。

6、刷新页面,预览效果:你会发现,多了一个菜单

(五)rbac 效果预览

效果:“普通管理员”可以进行gii和debug的操作,而“站长”除了可以进行gii和debug的操作,还可以进行“权限控制”的操作。

一、创建“调试”的权限:可以进行 gii 和 degug 的操作

1、点击“路由”,将 /gii/* 、/gii/default/index、/debug/* 、/degug/default/index 写入到 auth_item 表

2、点击“权限”,创建名为“调试”的权限,并分配 /gii/* 和 /debug/* 路由

3、点击“角色”,创建名为“普通管理员”的角色,并分配“调式”的权限

二、创建“调式”的菜单

1、创建

gii 菜单:Parent —— 调式;Name —— gii;Route —— /gii/default/index;Order —— 1
debug 菜单:Parent —— 调式;Name —— debug;Route —— /debug/default/index;Order —— 2

2、分配“调式“权限给”站长“角色

3、刷新页面,你会发现左侧导航栏多了调式的菜单

三、创建“普通管理员“角色的新用户

1、进入前台 127.0.0.1/advanced/frontend/web 进行注册新用户

2、进入后台 127.0.0.1/advanced/backend/web/admin/assignment/index

点击 admin 的查看按钮,为 admin 分配普通管理员的角色

3、刷新页面,你会发现 admin 用户也多了 调试的菜单

四、rbac 的作用

1、在步骤三、2中 admin 用户通过 输入地址:127.0.0.1/advanced/backend/web/admin/assignment 进入分配角色的页面,现在我们通过配置限制用户访问,配置文件为 backend/main.php

2、现在 admin 用户通过 127.0.0.1/advanced/backend/web/admin/assignment 会出现下面的界面,说明 rbac 成功了

3、退出 admin 用户,登录 master 用户,发现 master 可以执行 admin/assignment 操作

(六)规则的讲解

需求:普通管理员只可以查看修改自己的信息,而站长可以修改所有人的信息

一、用 gii 生成 user 模型和 CRUD 操作

image

二、创建“管理用户”和”规则“菜单

1、点击“路由”,然后点击

,即可以看到多了刚刚生成的 userController 的路由

将 /user/* 和 /user/index 移动至右边

将 /admin/rule/* 和 /admin/rule/index 也移动至右边,待会创建 “规则” 菜单

2、点击“菜单”创建以下菜单

image

三、添加“规则”(路由)给“权限控制”(权限)

1、点击“权限”然后进行创建“管理用户”的权限

2、点击“权限”,然后再点击”权限控制“的查看按钮,将 /admin/rule/* 移至右边

3、点击“角色”,为“站长”和“普通管理员”添加“管理用户”的权限

四、为“普通管理员”添加“修改用户”的规则

1、新建“修改用户”的规则

新建 backend\components\UserRule 这个类文件

刷新页面,左侧菜单出现“规则”的菜单,点击“规则”创建“修改用户”的规则

2、为“普通管理员”添加“修改用户”的规则

点击“角色”,再点击“普通管理员”的更新按钮

打开 auth_item 表,可以发现“普通管理员”这个记录被修改了

五、测试“修改用户”的规则是否发挥作用

1、登录 master 站长,点击“管理用户”,再点击 admin 修改的按钮,发现可以修改
2、登录 admin 普通管理员,点击“管理用户”,再点击 master 修改的按钮,发现无法可以修改

表明“修改用户”的规则对“普通管理员”这个角色发挥作用了。

注意:测试时务必把 \backend\main.php 的 * 注释掉

更多细节详见https://www.lulublog.cn/post/16

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351