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

(一)—— 安裝 yii2 和 composer

一匀们、安裝 yii2**

1缴淋、下載高級(jí)應(yīng)用程序模板
2、新建數(shù)據(jù)庫(kù) advanced泄朴,然后新建 user 用戶(hù)表

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT "自增ID",  
`username` varchar(255) NOT NULL COMMENT "用戶(hù)名",  
`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="用戶(hù)表";

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

二祖灰、安裝 composer

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

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

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

2三妈、使用中國(guó)鏡像:

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

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

② 安裝最新的Composer 資源插件:它是通過(guò) 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è)頁(yè)面,包括儀表盤(pán)糖儡、郵箱伐坏、日歷、鎖屏握联、登錄及注冊(cè)桦沉、404錯(cuò)誤每瞒、500錯(cuò)誤等頁(yè)面。

進(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/ 查看效果

注釋?zhuān)喝绻龅巾?yè)面不斷刷新浓利,可能是因?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必須要開(kāi)啟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' => [
        //這里是允許訪問(wèn)的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)建成功之后來(lái)到權(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è)叫“站長(zhǎng)”的角色

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

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

創(chuàng)建成功之后來(lái)到角色的視圖界面進(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)前用戶(hù)的查看按鈕,將“站長(zhǎng)”這個(gè)角色分配給當(dāng)前用戶(hù)

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

image

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

(四)創(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;
        }
        //沒(méi)配置圖標(biāo)的顯示默認(rèn)圖標(biāo)
        (!isset($return['icon']) || !$return['icon']) && $return['icon'] = 'fa fa-circle-o';
        $items && $return['items'] = $items;
        return $return;
    };
    //這里我們對(duì)一開(kāi)始寫(xiě)的菜單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è)路由寫(xiě)到 auth_item 表(為了分配路由給菜單)

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

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

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

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

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

效果:“普通管理員”可以進(jìn)行g(shù)ii和debug的操作蝉绷,而“站長(zhǎng)”除了可以進(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 寫(xiě)入到 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)限給”站長(zhǎng)“角色

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

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

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

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

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

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

四苔咪、rbac 的作用

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

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

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

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

需求:普通管理員只可以查看修改自己的信息丙者,而站長(zhǎng)可以修改所有人的信息

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

image

二、創(chuàng)建“管理用戶(hù)”和”規(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)建“管理用戶(hù)”的權(quán)限

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

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

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

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

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

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

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

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

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

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

1少漆、登錄 master 站長(zhǎng),點(diǎn)擊“管理用戶(hù)”硼被,再點(diǎn)擊 admin 修改的按鈕示损,發(fā)現(xiàn)可以修改
2、登錄 admin 普通管理員嚷硫,點(diǎn)擊“管理用戶(hù)”检访,再點(diǎn)擊 master 修改的按鈕,發(fā)現(xiàn)無(wú)法可以修改

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脆贵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子起暮,更是在濱河造成了極大的恐慌卖氨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件负懦,死亡現(xiàn)場(chǎng)離奇詭異筒捺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纸厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)系吭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颗品,你說(shuō)我怎么就攤上這事肯尺。” “怎么了躯枢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵则吟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锄蹂,道長(zhǎng)逾滥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮寨昙,結(jié)果婚禮上讥巡,老公的妹妹穿的比我還像新娘。我一直安慰自己舔哪,他們只是感情好欢顷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捉蚤,像睡著了一般抬驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缆巧,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天布持,我揣著相機(jī)與錄音,去河邊找鬼陕悬。 笑死题暖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捉超。 我是一名探鬼主播胧卤,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拼岳!你這毒婦竟也來(lái)了枝誊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惜纸,失蹤者是張志新(化名)和其女友劉穎叶撒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耐版,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祠够,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椭更。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪审。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛾魄,死狀恐怖虑瀑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滴须,我是刑警寧澤舌狗,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站扔水,受9級(jí)特大地震影響痛侍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一主届、第九天 我趴在偏房一處隱蔽的房頂上張望赵哲。 院中可真熱鬧,春花似錦君丁、人聲如沸枫夺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橡庞。三九已至,卻和暖如春印蔗,著一層夾襖步出監(jiān)牢的瞬間扒最,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工华嘹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吧趣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓除呵,卻偏偏與公主長(zhǎng)得像再菊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颜曾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354