使用Yii2 rbac許可權控制功能表menu

來源:互聯網
上載者:User
這篇文章主要介紹了Yii2 rbac許可權控制之菜單menu執行個體教程的相關資料,需要的朋友可以參考下

在上篇文章給大家介紹了yii2搭建完美後台並實現rbac許可權控制執行個體教程中完美實現了yii2的後台搭建和rbac許可權控制,如果你還沒有實現,請先看上文再回來參考本文,因為本文是在上文的基礎上進行完善和補充。

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

利用menu表添加菜單

左側菜單結果adminlte完美呈現

菜單前面自訂icon小表徵圖並呈現

如何控制功能表的顯示或者隱藏

頁面操作按鈕沒許可權的不做顯示

gridview中也只顯示有操作許可權的按鈕

嗯,差不多就這麼多,如果你還有其他的有關許可權控制功能表的需求,請下方留言,咱們共同切磋交流。

先看圖預覽下大致效果,不然怎麼激起你們好學的心。

首先我們先訪問路由頁面 /dmin/route/index ,儘可能的把左側的全部選中,然後移動到右側,,然後記得給目前使用者分配相關的可存取權限哦。

接下來訪問菜單列表 /admin/menu/index 點擊添加菜單,如果這個時候你沒有許可權訪問了,請你在設定檔的 as access檔案內暫時允許目前使用者訪問任意許可權,並在我們添加完許可權的時候去掉as access的設定,一定要記得哦,不然許可權失效了可別回來找我。

這裡我們先填寫中標紅的四個欄位

舉個例子:我們要添加一級菜單"許可權管理"

名稱請填寫"許可權管理",因為是一級菜單,父級名稱請留空,路由我們這裡選擇"/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,重新整理頁面看看你的菜單,雖然我們還沒完全實現我們想要的功能,不過到此你應該能看到你的菜單展現了。

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

還記得我們一開始建立菜單的時候,唯一沒進行填寫的選項"資料"嗎?為了後續操作方便,我們這裡一併把表徵圖和隱藏的選項都填寫上。我們以開始中的"後台使用者管理"這個二級菜單為例進行修改。大家先看看我們的菜單目前的狀態,

請在其更新頁面的“資料”項中務必填寫下面的代碼,如果你有新的想法,還請先按照我的思路後面再做修改,因為後面我們要進行操作。

{"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和設定菜單的隱藏。如果你有其他的屬性需要進行配置,此處仍然可以繼續單獨配置。

現在,我們還有兩個任務仍待完成,要完成接下來的兩個任務,為了大家的方便,建議你的項目可以自訂配置gii模版,不支援自訂gii模板的可以參考自訂gii模版 當你發現我們後面需要做的功能,我覺得你會讚歎我們這裡的操作。

為了方便操作,我們這裡增加一個測試表test,我們先用未做修改的gii模版產生一份model+curd。我們先把test/*的所有許可權分配給當前登入的使用者,並添加一條資料。開啟/test我們可以正常看到下面的,注意圖中的兩個標記。

然後我們開啟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許可權,然後你在重新整理下頁面看看效果,我們看看。

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

如果你的gii模板是自訂的,相信你會迅速在其產生的模板中所有的操作上添加許可權控制的,是不是很happy

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

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.