## RBAC集成AdminLTE后臺主題對菜單進行控制
本文參考自[yii2權限控制rbac之菜單menu最詳細教程](http://www.manks.top/article/yii2_rbac_menu)
對于RBAC權限的基本使用可以參看 Yii2項目后臺整合yii2-admin模塊 進行快速搭建。
這里通過用戶擁有的權限對后臺管理平臺的菜單進行控制。
### 利用AdminLTE渲染后臺模板
后臺的模板這里采用[?AdminLTE](https://packagist.org/packages/dmstr/yii2-adminlte-asset#2.3.0)(Backend theme for Yii2 Framework)
#### 安裝AdminLTE
可以參考[GitHub地址](https://github.com/dmstr/yii2-adminlte-asset),也可以參考之前寫的一個[總結地址](http://blog.webfsd.com/article-214.html)進行安裝。
#### yii2配置整合AdminLTE
建議拷貝`<project>/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app`目錄下的`layouts`和`site`目錄拷貝并覆蓋掉`<project>/backend/views/`目錄下的`lauouts`和`site`對應的文件。
訪問后臺地址得到如下效果:

> 如果訪問權限相關的路徑,如`/admin/route/index`并不是上面看到的樣式,請將配置文件中的`modules`數組中配置的`layouts`的值刪掉即可。如下:

### 啟動更多可分配路由
我們先訪問路由頁面 `/admin/route` ,盡可能的把左側的全部選中,然后移動到右側。

> 并記得給當前用戶分配相關的可訪問權限。
### 授權給用戶
參考上一篇RBAC授權方式對用戶進行授權,這里可以這樣測試。
1. 將admin用戶寫入到**超級管理員**并設置`/*`權限。

2. 將test用戶授權**一般用戶組**,并使用超級管理員帳號控制一般用戶組權限。

> 使用**admin**帳號登錄后臺訪問將有所有權限。使用**test**帳號登錄后臺僅有列表權限無法對數據進行增刪改操作。
### 添加菜單
訪問菜單列表 `admin/menu` 點擊添加菜單`admin/menu/create`按鈕。
> 如果這個時候你沒有權限訪問了,需要在配置文件的 `as access`數組暫時允許當前用戶訪問任意權限,并在我們添加完權限的時候去掉`as access`的設置,切記。
> 
添加界面如下


1. 例如添加一級菜單"權限管理",按照如下填寫:
- 名稱:權限管理
- 父級名稱:不填
- 路由:`/admin/default/index`
- 排序:1
- 數據:暫不填寫
2. 添加一個二級菜單"角色列表",如下:
- 名稱:角色列表
- 父級名稱:權限管理
- 路由:`/admin/role/index`
- 排序:2
- 數據:暫不填寫
然后依次寫入:`權限列表(/admin/permission/index)`、`路由列表(admin/route/index)`、`規則管理(admin/rule/index)`、`分配用戶到角色(/admin/assignment/index)`等,具體如下。

### 展示菜單
修改`<project>/backend/views/layouts/left.php`文件(保證這個文件是從`<project>/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app/views/layouts/left.php`地方復制過來的,否則去修改源文件),添加如下代碼:
```php
use mdm\admin\components\MenuHelper;
<?= dmstr\widgets\Menu::widget([
'options' => ['class' => 'sidebar-menu'],
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id),
]); ?>
```
[TOC]
### 菜單小圖標并控制菜單顯示
我們在創建菜單的時候,沒填寫的"數據"一欄,我們填寫json數據`{"icon": "fa fa-user", "visible": false}`,其中icon代表列表前面的小圖標;visible表示是否顯示,值false表示隱藏,不填或者填true表示顯示(z這個選項可以用于開發者模式,比如開發者可見,不是開發模式不可見)。
接下來我們對展示菜單的代碼也做稍微的整改`<project>/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app/views/layouts/left.php`增加一個callback處理函數。
```php
<?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) {
//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;
};
?>
<?= dmstr\widgets\Menu::widget([
'options' => ['class' => 'sidebar-menu'],
'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id,null,$callback),
]); ?>
```
修改效果如下(自定義了一個icon小圖標):

> 這里的`$callback`函數也只是針對上面我們添加菜單的"數據"項進行的分析。不難看出,我們對`icon`和`visible`分別進行了判斷,并追加到當前menu中。
[TOC]
### 控制頁面內的其他操作顯示與隱藏
這里以新建的goods操作為例,修改`<project>/advanced/backend/views/goods/index.php`頁面的一些控制,如`create`、`view`、`update`和`delete`操作的權限。
```php
//沒有創建權限不顯示按鈕
if (Helper::checkRoute('create')) {
echo Html::a('Create Goods', ['create'], ['class' => 'btn btn-success']);
} ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'goods_name',
'goods_number',
'goods_desc',
'created_at',
// 'updated_at',
[
'class' => 'yii\grid\ActionColumn',
'template' => Helper::filterActionColumn('{view}{update}{delete}'),
],
],
]); ?>
```
檢查當前用戶是否擁有上述權限`goods/index`、`goods/view`、`goods/create`.. 如果沒有效果請查看更新權限,如下。

**管理員**角色組相應得到的操作界面如下:

也就是說我們沒有權限的按鈕消失了,當在地址欄輸入`/goods/create`的時候你會發現也會提醒沒有權限。
> 也可以將這個修改更改到gii的自定義模板,加速開發。
- 開始
- Yii2開發小技巧
- Yii2使用不同的方式進行郵件發送邏輯處理
- Yii2 Serialization of 'Closure' is not allowed 錯誤
- Yii創建應用
- Yii應用結構和流程
- Yii的路徑別名
- Yii的請求
- Yii的響應
- Sessions 和 Cookies
- Yii自定義全局工具函數
- Yii2模型
- Yii2視圖
- Yii2控制器
- 大數據節省內存處理
- 關聯查詢hasMany、hasOne
- Yii2 URL地址美化
- Yii2整合AdminLTE后臺主題
- Yii2模型中的場景
- Yii2中的RBAC
- Yii2項目后臺整合yii2-admin模塊
- RBAC集成AdminLTE后臺主題對菜單進行控制
- Yii2自定義Gii模板
- 修復AdminLTE引用外部字體文件導致訪問變慢的情況
- Yii2事件簡單使用
- Yii2模型事件
- Yii2使用GridView新增操作按鈕
- Yii2向loyout模板文件中傳值
- Yii2數據緩存
- Yii2緩存
- Yii2數據緩存之增刪改查
- Yii2拓展
- Yii2日期時間插件-datetimepicker
- kartik-v/yii2-widget-fileinput上傳插件