RBAC實(shí)現(xiàn)(AdminLTE、yii-admin)

(一)—— 安裝 yii2 和 composer

一、安裝 yii2**

1、下載高級(jí)應(yīng)用程序模板
2、新建數(shù)據(jù)庫 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 "自動(dòng)登錄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 "角色等級(jí)",  
`status` smallint(6) NOT NULL DEFAULT "10" COMMENT "狀態(tài)",  
`created_at` int(11) NOT NULL COMMENT "創(chuàng)建時(shí)間",  
`updated_at` int(11) NOT NULL COMMENT "更新時(shí)間",  
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT="用戶表";

配置數(shù)據(jù)庫文件 advanced/common/main-local.php
前臺(tái)地址: 127.0.0.1/advanced/frontend/web/ ,進(jìn)入前臺(tái)后點(diǎn)擊 Signup 注冊(cè)用戶
后臺(tái)地址:127.0.0.1/advanced/backend/web,進(jìn)入后臺(tái)登錄用戶

二、安裝 composer

1、Composer 是 PHP 的一個(gè)依賴管理工具,下載地址

下載之后直接運(yùn)行進(jìn)行安裝,安裝過程需要選擇你的 php 可執(zhí)行文件,如下圖所示:

進(jìn)入 cmd 輸入 composer 查看是否安裝成功,下圖是安裝成功界面

2、使用中國鏡像:

① 進(jìn)入 cmd,輸入:

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

② 安裝最新的Composer 資源插件:它是通過 Composer 管理 bower 和 npm 包所必須的,此命令全局生效,一勞永逸。
進(jìn)入 cmd,輸入:

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

③ 注:更新 yii2 ,進(jìn)入 cmd ,切換目錄到 advanced,輸入

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

(二)安裝 AdminLTE 渲染后臺(tái)和 yii2-admin 集成 rbac

一、安裝 AdminLTE 渲染后臺(tái)

1、利用 AdminLTE 渲染后臺(tái)模板

AdminLTE 是一個(gè)完全響應(yīng)管理模板?;?Bootstrap3 框架,易定制模板。適合多種屏幕分辨率,從小型移動(dòng)設(shè)備到大型臺(tái)式機(jī)。內(nèi)置了多個(gè)頁面,包括儀表盤、郵箱、日歷、鎖屏、登錄及注冊(cè)、404錯(cuò)誤、500錯(cuò)誤等頁面。

進(jìn)入 cmd,切換到 advanced 目錄,輸入

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

復(fù)制 vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app到 backend/views/,需要覆蓋的則覆蓋

2、進(jìn)入后臺(tái) 127.0.0.1/advanced/backend/web/ 查看效果

注釋:如果遇到頁面不斷刷新,可能是因?yàn)榧虞d資源的時(shí)候在獲取 google 的 css 資源

解決辦法:

①、下載谷歌字體,將壓縮包解壓至backend\web\css 目錄下
②、在 backend\config\main.php 的 components 配置項(xiàng)中添加

'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 的一套管理工具,實(shí)現(xiàn)了漂亮的界面和完整的權(quán)限管理功能

進(jìn)入 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
    // * 表示允許所有,后期會(huì)介紹這個(gè)
        '*'
    ]
],
'components' => [
    "authManager" => [
        "class" => 'yii\rbac\DbManager',
        "defaultRoles" => ["guest"],
    ],
],
3、導(dǎo)入 rbac 表格

執(zhí)行.sql 文件:vendor/yiisoft/yii2/rbac/migrations/schema-mysql.sql

4、運(yùn)行 127.0.0.1/advanced/backend/web/admin/route 預(yù)覽效果

(三) rbac 詳細(xì)操作

1、下載 left.php 覆蓋 backend/views/layouts/left.php

進(jìn)入 127.0.0.1/advanced/backend/web/ 預(yù)覽效果

2、點(diǎn)擊“路由”,將下圖中的幾個(gè)路由移動(dòng)到右邊

image

查看 auth_item 數(shù)據(jù)表,發(fā)現(xiàn)新增了幾行我們剛剛添加的記錄


image

3、點(diǎn)擊“權(quán)限”,然后點(diǎn)擊 創(chuàng)建按鈕進(jìn)行創(chuàng)建權(quán)限

image

再次查看 auth_item 表,你會(huì)發(fā)現(xiàn)多了一條記錄

創(chuàng)建成功之后來到權(quán)限的視圖界面進(jìn)行分配權(quán)限,將剛剛創(chuàng)建的全部路由分配給該權(quán)限

image

查看 auth_item_child 表,發(fā)現(xiàn)新增了四條記錄,可以簡(jiǎn)單理解:auth_item_child 為權(quán)限分配了路由

4、點(diǎn)擊“角色”,創(chuàng)建一個(gè)叫“站長”的角色

查看 auth_item 表,你會(huì)發(fā)現(xiàn)多了一條記錄

此時(shí)你會(huì)發(fā)現(xiàn),在 auth_item 表中,tyep=1表示角色、type=2表示權(quán)限。

創(chuàng)建成功之后來到角色的視圖界面進(jìn)行分配路由,將剛剛創(chuàng)建的“權(quán)限控制”分配給該角色

查看 auth_item_child 表,你會(huì)發(fā)現(xiàn)多了一條記錄

可以簡(jiǎn)單理解:auth_item_child 為角色分配了權(quán)限

5、點(diǎn)擊“分配”,然后點(diǎn)擊當(dāng)前用戶的查看按鈕,將“站長”這個(gè)角色分配給當(dāng)前用戶

查看 auth_assignment 表,你會(huì)發(fā)現(xiàn)多了一條記錄

image

可以簡(jiǎn)單理解:auth_assignment 為用戶分配了角色

(四)創(chuàng)建左側(cè)導(dǎo)航欄菜單

1、創(chuàng)建 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>后面添加以下內(nèi)容

<?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;
        }
        //沒配置圖標(biāo)的顯示默認(rèn)圖標(biāo)
        (!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o';
        $items && $return['items'] = $items;
        return $return;
    };
    //這里我們對(duì)一開始寫的菜單menu進(jìn)行了優(yōu)化
    echo dmstr\widgets\Menu::widget( [
        'options' => ['class' => 'sidebar-menu tree','data-widget'=>'tree'],
        'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id,null, $callback),
    ] ); 
?>

3、點(diǎn)擊“菜單”,然后點(diǎn)擊 創(chuàng)建按鈕進(jìn)行創(chuàng)建菜單

4、點(diǎn)擊“路由”,將以下幾個(gè)路由寫到 auth_item 表(為了分配路由給菜單)

點(diǎn)擊“權(quán)限”,再點(diǎn)擊查看“權(quán)限控制”,分配** /admin/menu/***

5、點(diǎn)擊“菜單”,創(chuàng)建以下子菜單

注意:填寫 “Parent” 即父級(jí)菜單的名稱時(shí)要手動(dòng)選擇才行,直接全打上 會(huì)保存不了的。比如:先輸入“權(quán)限”,然后出現(xiàn)下拉菜單就可以選擇“權(quán)限控制”了。

6、刷新頁面,預(yù)覽效果:你會(huì)發(fā)現(xiàn),多了一個(gè)菜單

(五)rbac 效果預(yù)覽

效果:“普通管理員”可以進(jìn)行g(shù)ii和debug的操作,而“站長”除了可以進(jìn)行g(shù)ii和debug的操作,還可以進(jìn)行“權(quán)限控制”的操作。

一、創(chuàng)建“調(diào)試”的權(quán)限:可以進(jìn)行 gii 和 degug 的操作

1、點(diǎn)擊“路由”,將 /gii/* 、/gii/default/index、/debug/* 、/degug/default/index 寫入到 auth_item 表

2、點(diǎn)擊“權(quán)限”,創(chuàng)建名為“調(diào)試”的權(quán)限,并分配 /gii/* 和 /debug/* 路由

3、點(diǎn)擊“角色”,創(chuàng)建名為“普通管理員”的角色,并分配“調(diào)式”的權(quán)限

二、創(chuàng)建“調(diào)式”的菜單

1、創(chuàng)建

gii 菜單:Parent —— 調(diào)式;Name —— gii;Route —— /gii/default/index;Order —— 1
debug 菜單:Parent —— 調(diào)式;Name —— debug;Route —— /debug/default/index;Order —— 2

2、分配“調(diào)式“權(quán)限給”站長“角色

3、刷新頁面,你會(huì)發(fā)現(xiàn)左側(cè)導(dǎo)航欄多了調(diào)式的菜單

三、創(chuàng)建“普通管理員“角色的新用戶

1、進(jìn)入前臺(tái) 127.0.0.1/advanced/frontend/web 進(jìn)行注冊(cè)新用戶

2、進(jìn)入后臺(tái) 127.0.0.1/advanced/backend/web/admin/assignment/index

點(diǎn)擊 admin 的查看按鈕,為 admin 分配普通管理員的角色

3、刷新頁面,你會(huì)發(fā)現(xiàn) admin 用戶也多了 調(diào)試的菜單

四、rbac 的作用

1、在步驟三、2中 admin 用戶通過 輸入地址:127.0.0.1/advanced/backend/web/admin/assignment 進(jìn)入分配角色的頁面,現(xiàn)在我們通過配置限制用戶訪問,配置文件為 backend/main.php

2、現(xiàn)在 admin 用戶通過 127.0.0.1/advanced/backend/web/admin/assignment 會(huì)出現(xiàn)下面的界面,說明 rbac 成功了

3、退出 admin 用戶,登錄 master 用戶,發(fā)現(xiàn) master 可以執(zhí)行 admin/assignment 操作

(六)規(guī)則的講解

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

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

image

二、創(chuàng)建“管理用戶”和”規(guī)則“菜單

1、點(diǎn)擊“路由”,然后點(diǎn)擊

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

將 /user/* 和 /user/index 移動(dòng)至右邊

將 /admin/rule/* 和 /admin/rule/index 也移動(dòng)至右邊,待會(huì)創(chuàng)建 “規(guī)則” 菜單

2、點(diǎn)擊“菜單”創(chuàng)建以下菜單

image

三、添加“規(guī)則”(路由)給“權(quán)限控制”(權(quán)限)

1、點(diǎn)擊“權(quán)限”然后進(jìn)行創(chuàng)建“管理用戶”的權(quán)限

2、點(diǎn)擊“權(quán)限”,然后再點(diǎn)擊”權(quán)限控制“的查看按鈕,將 /admin/rule/* 移至右邊

3、點(diǎn)擊“角色”,為“站長”和“普通管理員”添加“管理用戶”的權(quán)限

四、為“普通管理員”添加“修改用戶”的規(guī)則

1、新建“修改用戶”的規(guī)則

新建 backend\components\UserRule 這個(gè)類文件

刷新頁面,左側(cè)菜單出現(xiàn)“規(guī)則”的菜單,點(diǎn)擊“規(guī)則”創(chuàng)建“修改用戶”的規(guī)則

2、為“普通管理員”添加“修改用戶”的規(guī)則

點(diǎn)擊“角色”,再點(diǎn)擊“普通管理員”的更新按鈕

打開 auth_item 表,可以發(fā)現(xiàn)“普通管理員”這個(gè)記錄被修改了

五、測(cè)試“修改用戶”的規(guī)則是否發(fā)揮作用

1、登錄 master 站長,點(diǎn)擊“管理用戶”,再點(diǎn)擊 admin 修改的按鈕,發(fā)現(xiàn)可以修改
2、登錄 admin 普通管理員,點(diǎn)擊“管理用戶”,再點(diǎn)擊 master 修改的按鈕,發(fā)現(xiàn)無法可以修改

表明“修改用戶”的規(guī)則對(duì)“普通管理員”這個(gè)角色發(fā)揮作用了。

注意:測(cè)試時(shí)務(wù)必把 \backend\main.php 的 * 注釋掉

更多細(xì)節(jié)詳見https://www.lulublog.cn/post/16

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容