## 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`对应的文件。
访问后台地址得到如下效果:
![](https://box.kancloud.cn/9b06bc704a0bc8497ee14b0c38743d39_1527x733.png)
> 如果访问权限相关的路径,如`/admin/route/index`并不是上面看到的样式,请将配置文件中的`modules`数组中配置的`layouts`的值删掉即可。如下:
![](https://box.kancloud.cn/f10f6bad5cb6e6d9833958ca851275a8_721x146.png)
### 启动更多可分配路由
我们先访问路由页面 `/admin/route` ,尽可能的把左侧的全部选中,然后移动到右侧。
![](https://box.kancloud.cn/9810a7e6313ff42823ba2e488e4c7896_1348x587.png)
> 并记得给当前用户分配相关的可访问权限。
### 授权给用户
参考上一篇RBAC授权方式对用户进行授权,这里可以这样测试。
1. 将admin用户写入到**超级管理员**并设置`/*`权限。
![](https://box.kancloud.cn/55a1a6e55cc13ac959dfe985bf707230_1690x757.png)
2. 将test用户授权**一般用户组**,并使用超级管理员帐号控制一般用户组权限。
![](https://box.kancloud.cn/449cf87851541b7950bc6deac30bd946_1688x766.png)
> 使用**admin**帐号登录后台访问将有所有权限。使用**test**帐号登录后台仅有列表权限无法对数据进行增删改操作。
### 添加菜单
访问菜单列表 `admin/menu` 点击添加菜单`admin/menu/create`按钮。
> 如果这个时候你没有权限访问了,需要在配置文件的 `as access`数组暂时允许当前用户访问任意权限,并在我们添加完权限的时候去掉`as access`的设置,切记。
> ![](https://box.kancloud.cn/988224e213599b13d1ea389807407bdb_568x185.png)
添加界面如下
![](https://box.kancloud.cn/32c5074d661c7f9aa336e4e81d801f63_1686x573.png)
![](https://box.kancloud.cn/757353b82aeb643d85e11b606c016fea_1680x398.png)
1. 例如添加一级菜单"权限管理",按照如下填写:
- 名称:权限管理
- 父级名称:不填
- 路由:`/admin/default/index`
- 排序:1
- 数据:暂不填写
2. 添加一个二级菜单"角色列表",如下:
- 名称:角色列表
- 父级名称:权限管理
- 路由:`/admin/role/index`
- 排序:2
- 数据:暂不填写
然后依次写入:`权限列表(/admin/permission/index)`、`路由列表(admin/route/index)`、`规则管理(admin/rule/index)`、`分配用户到角色(/admin/assignment/index)`等,具体如下。
![](https://box.kancloud.cn/44d036e65c4a44d08c801ad378b94546_947x629.png)
### 展示菜单
修改`<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小图标):
![](https://box.kancloud.cn/0052060ff3052f1bb2f3c22c7800ae78_1173x455.png)
> 这里的`$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`.. 如果没有效果请查看更新权限,如下。
![](https://box.kancloud.cn/dd3d6e47c4986e738fcd58d4118e3aa8_925x523.png)
**管理员**角色组相应得到的操作界面如下:
![](https://box.kancloud.cn/53adb1b4865a92684dd509d77f680586_941x342.png)
也就是说我们没有权限的按钮消失了,当在地址栏输入`/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上传插件