## 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的自定义模板,加速开发。