搭建 rbac 后台系列教程

2016-07-25 鲁鲁槟 1

(一)—— 安装 yii2 和 composer

一、安装 yii2

1、下载高级应用程序模板

下载 Yii2 的高级应用程序模板

解压后将文件夹放在你的 apache 运行目录下

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="用户表";

3、运行 advanced/init.bat,输入 0 选择开发环境,然后再输入 yes 生成配置文件

配置数据库文件 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、点击“路由”,将下图中的几个路由移动到右边

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

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

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

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

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

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

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

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

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

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

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

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

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

可以简单理解: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、刷新页面,预览效果:你会发现,多了一个菜单(O(∩_∩)O哈哈~),请删除 left.php 中多余的 <ul></ul>

(五)—— 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 操作

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

1、点击“路由”,然后点击,即可以看到多了刚刚生成的 userController 的路由

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

共 9条评论

  • 刘阿勇
    刘阿勇 评论于2017-09-25

    楼主的表情包也很厉害的嘛

  • Mr_Xu
    Mr_Xu 评论于2018-09-11

    路由能整成中文吗

  • Mr_Xu
    Mr_Xu 评论于2018-09-12

    创建菜单那个地方一个大坑,无法选择父级名称,是因为jqurey-ui的版本有问题!!!!!(用1.12.0的)

    鲁鲁槟
    回复于 2018-09-12 回复

    感谢指正!!

    simon
    回复于 2018-09-21 回复

    这个是怎么修改得?能不能指导下?

    a16760108
    回复于 2018-09-27 回复

    @鲁鲁槟 我也是在创建菜单创建不了,能指导一下怎么做么?

  • a16760108
    a16760108 评论于2018-09-27

    我按你的设置显示不了菜单出来,{"icon";"fa fa-lock","visible";true},是这个写的有问题?

  • T_oath
    T_oath 评论于2018-10-18

    大佬,请教一下啊,我那个下拉框位置不对是为什么啊。他出现在了左上角 还被盖住了一大半,,,

  • 和圣诞节福利
    和圣诞节福利 评论于2018-10-31

    为什么我的权限那几个页面都是404?还有美化路由就403怎么解决啊

  • 鲁鲁槟
    鲁鲁槟 评论于2018-11-02

    😁😂😃😄😈👿

发表评论

您需要登录后才可以评论。登录 | 立即注册
阅读 3926 3