Yii2 rbac權(quán)限控制之菜單menu實(shí)例教程
在上篇文章給大家介紹了yii2搭建完美后臺(tái)并實(shí)現(xiàn)rbac權(quán)限控制實(shí)例教程中完美實(shí)現(xiàn)了yii2的后臺(tái)搭建和rbac權(quán)限控制,如果你還沒(méi)有實(shí)現(xiàn),請(qǐng)先看上文再回來(lái)參考本文,因?yàn)楸疚氖窃谏衔牡幕A(chǔ)上進(jìn)行完善和補(bǔ)充。
部分小伙們紛紛反映,最后菜單menu怎么控制權(quán)限呀,看不懂,搞不定,而且你那貌似沒(méi)搞完,瞎忽悠!確實(shí)沒(méi)那么全,今天看我們?nèi)绾螌?shí)現(xiàn)菜單完美權(quán)限化。先羅列下主要講的內(nèi)容,不需要的沒(méi)必要看下去,只為分享給有需要的人。
利用menu表添加菜單
左側(cè)菜單結(jié)果adminlte完美呈現(xiàn)
菜單前面自定義icon小圖標(biāo)并呈現(xiàn)
如何控制菜單的顯示或者隱藏
頁(yè)面操作按鈕沒(méi)權(quán)限的不做顯示
gridview中也只顯示有操作權(quán)限的按鈕
嗯,差不多就這么多,如果你還有其他的有關(guān)權(quán)限控制菜單的需求,請(qǐng)下方留言,咱們共同切磋交流。
先看圖預(yù)覽下大致效果,不然怎么激起你們好學(xué)的心。
首先我們先訪問(wèn)路由頁(yè)面 /dmin/route/index ,盡可能的把左側(cè)的全部選中,然后移動(dòng)到右側(cè),,然后記得給當(dāng)前用戶分配相關(guān)的可訪問(wèn)權(quán)限哦。
接下來(lái)訪問(wèn)菜單列表 /admin/menu/index 點(diǎn)擊添加菜單,如果這個(gè)時(shí)候你沒(méi)有權(quán)限訪問(wèn)了,請(qǐng)你在配置文件的 as access文件內(nèi)暫時(shí)允許當(dāng)前用戶訪問(wèn)任意權(quán)限,并在我們添加完權(quán)限的時(shí)候去掉as access的設(shè)置,一定要記得哦,不然權(quán)限失效了可別回來(lái)找我。
這里我們先填寫(xiě)上圖中標(biāo)紅的四個(gè)字段
舉個(gè)例子:我們要添加一級(jí)菜單"權(quán)限管理"
名稱請(qǐng)?zhí)顚?xiě)"權(quán)限管理",因?yàn)槭且患?jí)菜單,父級(jí)名稱請(qǐng)留空,路由我們這里選擇"/admin/default/index",注意了,如果匹配到任何路由,請(qǐng)?jiān)L問(wèn)路由頁(yè)面把左側(cè)的選中移動(dòng)到右側(cè)。
映射,其實(shí)就是排序高低的問(wèn)題,比如說(shuō)我添加了兩個(gè)菜單,映射值為1的就在上面 值為2的就在1的下面,我們這里填寫(xiě)數(shù)字1。
"數(shù)據(jù)"這一項(xiàng)我們后面再說(shuō)。
按照剛剛介紹的這種方式添加吧,舉一個(gè)添加二級(jí)菜單"權(quán)限控制"的例子
只需要把父級(jí)名稱這里填寫(xiě)我們剛剛添加成功的一級(jí)名稱"權(quán)限管理"即可。其他照舊。不會(huì)操作的多看兩遍,這里最好把權(quán)限管理的幾個(gè)菜單全部添加完畢,因?yàn)榻酉聛?lái)我們需要且你可以多練練手嘛。
到此我們已經(jīng)會(huì)添加菜單了。
我們來(lái)看下一步,利用我們之前搭建的后臺(tái)框架進(jìn)行展現(xiàn)。
use mdm\admin\components\MenuHelper; echo dmstr\widgets\Menu::widget( [ 'options' => ['class' => 'sidebar-menu'], 'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id), ] );
是不是很簡(jiǎn)單,What?我的怎么沒(méi)有dmstr這玩意,不好意思,已經(jīng)說(shuō)的很多遍,需要先看上文再有這個(gè)菜單的結(jié)合。
ok,刷新頁(yè)面看看你的菜單,雖然我們還沒(méi)完全實(shí)現(xiàn)我們想要的功能,不過(guò)到此你應(yīng)該能看到你的菜單展現(xiàn)了。
接下來(lái)將進(jìn)入我們的重點(diǎn)以及難點(diǎn),我們要實(shí)現(xiàn)菜單前面的小圖標(biāo)且完成菜單可隱藏控制。
還記得我們一開(kāi)始創(chuàng)建菜單的時(shí)候,唯一沒(méi)進(jìn)行填寫(xiě)的選項(xiàng)"數(shù)據(jù)"嗎?為了后續(xù)操作方便,我們這里一并把圖標(biāo)和隱藏的選項(xiàng)都填寫(xiě)上。我們以開(kāi)始截圖中的"后臺(tái)用戶管理"這個(gè)二級(jí)菜單為例進(jìn)行修改。截圖大家先看看我們的菜單目前的狀態(tài),
請(qǐng)?jiān)谄涓马?yè)面的“數(shù)據(jù)”項(xiàng)中務(wù)必填寫(xiě)下面的代碼,如果你有新的想法,還請(qǐng)先按照我的思路后面再做修改,因?yàn)楹竺嫖覀円M(jìn)行操作。
{"icon": "fa fa-user", "visible": false}
是的,這個(gè)"數(shù)據(jù)"項(xiàng)我們填寫(xiě)的是一段json代碼,接下來(lái)我們對(duì)展示菜單的代碼也做稍微的整改,為了方便大家看代碼,這里的$callback直接寫(xiě)在頁(yè)面上了,回頭大家可以繼續(xù)封裝優(yōu)化。
use mdm\admin\components\MenuHelper; <?php $callback = function($menu){ $data = json_decode($menu['data'], true); $items = $menu['children']; $return = [ 'label' => $menu['name'], 'url' => [$menu['route']], ]; //處理我們的配置 if ($data) { //visible isset($data['visible']) && $return['visible'] = $data['visible']; //icon isset($data['icon']) && $data['icon'] && $return['icon'] = $data['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'], 'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), ] ); ?>
是的,你沒(méi)有看錯(cuò),代碼是有點(diǎn)長(zhǎng),我們來(lái)簡(jiǎn)單分析分析。其實(shí)我們這里的$callback方法也只是針對(duì)上面我們添加菜單的"數(shù)據(jù)"項(xiàng)進(jìn)行的分析。不難看出,我們對(duì)icon和visible分別進(jìn)行了判斷,并追加到當(dāng)前menu中。
到此,我們費(fèi)了一番波折終于實(shí)現(xiàn)菜單加icon和設(shè)置菜單的隱藏。如果你有其他的屬性需要進(jìn)行配置,此處仍然可以繼續(xù)單獨(dú)配置。
現(xiàn)在,我們還有兩個(gè)任務(wù)仍待完成,要完成接下來(lái)的兩個(gè)任務(wù),為了大家的方便,建議你的項(xiàng)目可以自定義配置gii模版,不支持自定義gii模板的可以參考自定義gii模版 當(dāng)你發(fā)現(xiàn)我們后面需要做的功能,我覺(jué)得你會(huì)贊嘆我們這里的操作。
為了方便操作,我們這里增加一個(gè)測(cè)試表test,我們先用未做修改的gii模版生成一份model+curd。我們先把test/*的所有權(quán)限分配給當(dāng)前登錄的用戶,并添加一條數(shù)據(jù)。打開(kāi)/test我們可以正常看到下面的截圖,注意圖中的兩個(gè)標(biāo)記。
然后我們打開(kāi)test/index.php文件,對(duì)標(biāo)記的兩個(gè)地方進(jìn)行如下修改
use mdm\admin\components\Helper; <?php //沒(méi)有創(chuàng)建權(quán)限不顯示按鈕 if(Helper::checkRoute('create')) { echo Html::a('Create Test', ['create'], ['class' => 'btn btn-success']); } ?> <?= GridView::widget([ // ...... 'columns' => [ // ...... [ 'class' => 'yii\grid\ActionColumn', 'template' => Helper::filterActionColumn('{view}{update}{delete}'), ], ], ]); ?>
現(xiàn)在我們刷新下頁(yè)面/test再看看,好像沒(méi)什么變化嘛。別急,我們現(xiàn)在撤銷當(dāng)前用戶的/test/create 權(quán)限和/test/update權(quán)限,然后你在刷新下頁(yè)面看看效果,我們截圖看看。
也就是說(shuō)我們沒(méi)有權(quán)限的按鈕消失了,當(dāng)你手動(dòng)訪問(wèn)/test/create的時(shí)候你會(huì)發(fā)現(xiàn)也會(huì)提醒你沒(méi)有權(quán)限。
如果你的gii模板是自定義的,相信你會(huì)迅速在其生成的模板中所有的操作上添加權(quán)限控制的,是不是很happy
最后,我們的菜單menu關(guān)于權(quán)限控制的講解基本也就結(jié)束了,長(zhǎng)篇大論,仔細(xì)回想起來(lái)也沒(méi)多少東西,倒是希望能幫到你一二
- yii2 RBAC使用DbManager實(shí)現(xiàn)后臺(tái)權(quán)限判斷的方法
- Yii2 rbac權(quán)限控制之rule教程詳解
- Yii2 rbac權(quán)限控制操作步驟實(shí)例教程
- Yii2搭建后臺(tái)并實(shí)現(xiàn)rbac權(quán)限控制完整實(shí)例教程
- YII框架模塊化處理操作示例
- YII分模塊加載路由的實(shí)現(xiàn)方法
- Yii中srbac權(quán)限擴(kuò)展模塊工作原理與用法分析
- YII模塊實(shí)現(xiàn)綁定二級(jí)域名的方法
- Yii2創(chuàng)建控制器(createController)方法詳解
- yii2控制器Controller Ajax操作示例
- Yii2設(shè)置默認(rèn)控制器的兩種方法
- Yii2框架控制器、路由、Url生成操作示例
- YII2框架中使用RBAC對(duì)模塊,控制器,方法的權(quán)限控制及規(guī)則的使用示例
相關(guān)文章
destoon二次開(kāi)發(fā)模板及調(diào)用語(yǔ)法匯總
這篇文章主要介紹了destoon二次開(kāi)發(fā)模板及調(diào)用語(yǔ)法,需要的朋友可以參考下2014-06-06php微信公眾號(hào)開(kāi)發(fā)之答題連闖三關(guān)
這篇文章主要為大家詳細(xì)介紹了php微信公眾號(hào)開(kāi)發(fā)之答題連闖三關(guān),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Laravel 5框架學(xué)習(xí)之Blade 簡(jiǎn)介
本文給大家?guī)?lái)的是Laravel5框架學(xué)習(xí)系列文章的第4篇,主要向大家簡(jiǎn)單介紹下Blade,為什么要介紹它呢,因?yàn)閘aravel的模版引擎采用了blade模版引擎,so....2015-04-04PHP獨(dú)立Session數(shù)據(jù)庫(kù)存儲(chǔ)操作類分享
這篇文章主要介紹了PHP獨(dú)立Session數(shù)據(jù)庫(kù)存儲(chǔ)操作類分享,需要的朋友可以參考下2014-06-06PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程
這篇文章主要介紹了PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程,本文用一個(gè)需求為引,詳細(xì)介紹每一步驟的做法,并配有大量圖片說(shuō)明,需要的朋友可以參考下2014-07-07phpstudy本地環(huán)境搭建超詳細(xì)圖文教程
這篇文章主要給大家介紹了關(guān)于phpstudy本地環(huán)境搭建超詳細(xì)圖文教程的相關(guān)資料,phpStudy是集安全、高效、功能于一體且完全免費(fèi)的一鍵服務(wù)器環(huán)境搭建軟件,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Thinkphp5分頁(yè)后攜帶參數(shù)跳轉(zhuǎn)傳遞功能實(shí)現(xiàn)
這篇文章主要介紹了Thinkphp5分頁(yè)后攜帶參數(shù)進(jìn)行跳轉(zhuǎn)傳遞,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06thinkphp5.1 中使用自定義異常處理類進(jìn)行接管
這篇文章主要介紹了thinkphp5.1 中使用自定義異常處理類進(jìn)行接管,本文通過(guò)配置文件的修改和具體代碼實(shí)現(xiàn)詳細(xì)展開(kāi)的講解了如何使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07