yii2權限控制rbac之菜單menu最詳細教程

前面咱們在博文 yii2搭建完美后臺並實現rbac權限控制實例教程中完美實現了yii2的後臺搭建和rbac權限控制,若是你尚未實現,請先看上文再回來參考本文,由於本文是在上文的基礎上進行完善和補充。php

先認個錯,罪過了,你將要看的這篇教程是菜單權限的擴展,若是你的菜單出不來,非常建議你參考 yii2 rbac權限控制詳細操做步驟html

部分小夥們紛紛反映,最後菜單menu怎麼控制權限呀,看不懂,搞不定,並且你那貌似沒搞完,瞎忽悠!確實沒那麼全,今天看咱們如何實現菜單完美權限化。先羅列下主要講的內容,不須要的不必看下去,只爲分享給有須要的人。json

  • 利用menu表添加菜單
  • 左側菜單結果adminlte完美呈現
  • 菜單前面自定義icon小圖標並呈現
  • 如何控制菜單的顯示或者隱藏
  • 多控制器激活當前菜單
  • 頁面操做按鈕沒權限的不作顯示
  • gridview中也只顯示有操做權限的按鈕

嗯,差很少就這麼多,若是你還有其餘的有關權限控制菜單的需求,請下方留言,我們共同切磋交流。yii2

先看圖預覽下大體效果,否則怎麼激起大家好學的心。app

71bbc0564d-yii2rbacmenu.png

首先咱們先訪問路由頁面 /admin/route/index ,儘量的把左側的所有選中,而後移動到右側,,而後記得給當前用戶分配相關的可訪問權限哦。框架

接下來訪問菜單列表 /admin/menu/index 點擊添加菜單,若是這個時候你沒有權限訪問了,請你在配置文件的 as access文件內暫時容許當前用戶訪問任意權限,並在咱們添加完權限的時候去掉as access的設置,必定要記得哦,否則權限失效了可別回來找我。yii

c4c812b7fa-yii2rbacmenu2.png

這裏咱們先填寫上圖中標紅的四個字段ide

舉個例子:咱們要添加一級菜單"權限管理"測試

名稱請填寫"權限管理",由於是一級菜單,父級名稱請留空,路由咱們這裏選擇"/admin/default/index",注意了,若是匹配到任何路由,請訪問路由頁面把左側的選中移動到右側。優化

映射,其實就是排序高低的問題,好比說我添加了兩個菜單,映射值爲1的就在上面 值爲2的就在1的下面,咱們這裏填寫數字1。

"數據"這一項咱們後面再說。

按照剛剛介紹的這種方式添加吧,舉一個添加二級菜單"權限控制"的例子

只須要把父級名稱這裏填寫咱們剛剛添加成功的一級名稱"權限管理"便可。其餘照舊。不會操做的多看兩遍,這裏最好把權限管理的幾個菜單所有添加完畢,由於接下來咱們須要且你能夠多練練手嘛。

到此咱們已經會添加菜單了。

咱們來看下一步,利用咱們以前搭建的後臺框架進行展示。

use mdm\admin\components\MenuHelper; 
echo dmstr\widgets\Menu::widget( [
     'options' => ['class' => 'sidebar-menu'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id), 
] );

是否是很簡單,What?個人怎麼沒有dmstr這玩意,很差意思,已經說的不少遍,須要先看上文再有這個菜單的結合。

ok,刷新頁面看看你的菜單,雖然咱們還沒徹底實現咱們想要的功能,不過到此你應該能看到你的菜單展示了。

接下來將進入咱們的重點以及難點,咱們要實現菜單前面的小圖標且完成菜單可隱藏控制。

還記得咱們一開始建立菜單的時候,惟一沒進行填寫的選項"數據"嗎?爲了後續操做方便,咱們這裏一併把圖標和隱藏的選項都填寫上。咱們以開始截圖中的"後臺用戶管理"這個二級菜單爲例進行修改。截圖你們先看看咱們的菜單目前的狀態,

76ec936ec5-yii2rbacmenu3.png

請在其更新頁面的「數據」項中務必填寫下面的代碼,若是你有新的想法,還請先按照個人思路後面再作修改,由於後面咱們要進行操做。

{"icon": "fa fa-user", "visible": false}

是的,這個"數據"項咱們填寫的是一段json代碼,接下來咱們對展現菜單的代碼也作稍微的整改,爲了方便你們看代碼,這裏的$callback直接寫在頁面上了,回頭你們能夠繼續封裝優化。

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; 
    } 
    //沒配置圖標的顯示默認圖標 
    (!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'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), 
] ); ?>

是的,你沒有看錯,代碼是有點長,咱們來簡單分析分析。其實咱們這裏的$callback方法也只是針對上面咱們添加菜單的"數據"項進行的分析。不難看出,咱們對icon和visible分別進行了判斷,並追加到當前menu中。

到此,咱們費了一番波折終於實現菜單加icon和設置菜單的隱藏。若是你有其餘的屬性須要進行配置,此處仍然能夠繼續單獨配置。

關於多控制器的激活,什麼意思呢?我來闡述兩句。

好比說咱們如今要訪問的菜單,其路由是/test/index,若是正常激活菜單的話,當咱們訪問/test/*的時候,其對應的左側菜單天然會處於激活狀態,可是,咱們想要的一種效果是,當訪問/test2/*(注意哦,這裏是test2另一個控制器)的時候咱們也想要激活當前菜單/test/index怎麼辦好呢?爲了文章的閱讀性更強,該問題屬於後期增添的,若是你有興趣,請移步yii2左側菜單子級沒法高亮的問題參考。

如今,咱們還有兩個任務仍待完成,要完成接下來的兩個任務,爲了你們的方便,建議你的項目能夠自定義配置gii模版,不支持自定義gii模板的能夠參考自定義gii模版 當你發現咱們後面須要作的功能,我以爲你會讚歎咱們這裏的操做。

爲了方便操做,咱們這裏增長一個測試表test,咱們先用未作修改的gii模版生成一份model+curd。咱們先把test/*的全部權限分配給當前登陸的用戶,並添加一條數據。打開/test咱們能夠正常看到下面的截圖,注意圖中的兩個標記。

6d11862d85-yii2rbacmenu4.png

 

而後咱們打開test/index.php文件,對標記的兩個地方進行以下修改

use mdm\admin\components\Helper; 
<?php 
//沒有建立權限不顯示按鈕 
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}'), 
        ], 
    ], 
]); ?>

如今咱們刷新下頁面/test再看看,好像沒什麼變化嘛。別急,咱們如今撤銷當前用戶的/test/create 權限和/test/update權限,而後你在刷新下頁面看看效果,咱們截圖看看。

352a3c8b81-yii2rbacmenu5.png

 

也就是說咱們沒有權限的按鈕消失了,當你手動訪問/test/create的時候你會發現也會提醒你沒有權限。

若是你的gii模板是自定義的,相信你會迅速在其生成的模板中全部的操做上添加權限控制的,是否是很happy

最後,咱們的菜單menu關於權限控制的講解基本也就結束了,長篇大論,仔細回想起來也沒多少東西,卻是但願能幫到你一二

相關文章
相關標籤/搜索