## 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

建议拷贝`/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app`目录下的`layouts`和`site`目录拷贝并覆盖掉`/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)

### 展示菜单

修改`/backend/views/layouts/left.php`文件(保证这个文件是从`/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这个选项可以用于开发者模式,比如开发者可见,不是开发模式不可见)。

接下来我们对展示菜单的代码也做稍微的整改`/vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app/views/layouts/left.php`增加一个callback处理函数。

```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操作为例,修改`/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的自定义模板,加速开发。

php rbac 菜单生成,RBAC集成AdminLTE后台主题对菜单进行控制相关推荐

  1. Spring boot入门(三):集成AdminLTE(Freemarker),结合generate代码生成器,利用DataTable和PageHelper分页...

    Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示 标题 ...

  2. html 后台参数attribute_平台管理后台与商家菜单资源管理:商家权限及其菜单资源管理设计...

    商家权限及其菜单资源管理设计 在商家的菜单体系中,我们设计了一个三级菜单,分别为分类.模块和资源.其中,分类菜单是顶级菜单,表示一个微服务应用;模块菜单是一个二级菜单,表示一个应用功能(实体)的主页; ...

  3. 仿微信公众号后台管理-自定义菜单

    最近在做后台管理界面 这是自定义菜单的页面笔记 (也不知道我的思路对不对) 点击菜单出现 创建第一个菜单,并在该菜单上方出现可添加子菜单的添加按钮, 并展示修改该菜单的相关内容 右侧展示有两个 一个关 ...

  4. WordPress后台添加侧边栏菜单

    https://my.oschina.net/shunshun/blog/78193 https://www.ludou.org/add-admin-menu-in-wordpress.html 添加 ...

  5. php在菜单栏里加子菜单,WordPress后台添加子菜单add_submenu_page()

    接上文:WordPress后台添加顶级菜单add_menu_page(),今儿再分享一下在 wordpress 后台侧边栏添加子菜单的方法,用到的函数是:add_submenu_page() 函数用法 ...

  6. UI标签库专题八:JEECG智能开发平台 Menu(左侧菜单生成标签)

     1. Menu(左侧菜单生成标签) 1.1. 参数 属性名 类型 描述 是否必须 默认值 style string 菜单样式 否 null parentFun string 一级菜单 是 nul ...

  7. php添加导航和删除导航,新增/修改/删除ECSHOP后台左侧导航菜单

    ECSHOP后台有许多管理菜单,是否有心想将一些不用的菜单删除呢,是否想增加或者修改菜单名称呢. 通过以下方法可以实现: 例如:我们要在后台新增一个菜单分类项"APP管理",再增加 ...

  8. python 菜单调用_python---权限管理和菜单生成

    class MenuHelper(object): def __init__(self,request,username): #当前请求的request self.request=request #当 ...

  9. 若依框架前端菜单生成,权限标识,路由地址

    若依菜单分类三种类型M(目录).C(菜单).F(按钮) 系统模板,模仿框架写法 根据后端生成代码来创建前端页面 在菜单管理页面生成目录和菜单 路由地址填写模块名 路由地址:控制器中的地址 组件路径:前 ...

最新文章

  1. 奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit
  2. 关于$ORACLE_HOME/bin/oracle文件属性
  3. 第一个以比特币现金ICO的项目,筹集了3000万美元
  4. android开发 修改标题栏背景_移动开发整体凉凉的背景下,究竟还剩哪些 Android热门前沿知识...
  5. Python:目录和文件的操作模块os.path和OS常用方法
  6. Python---udp绑定信息以及网络通信过程
  7. Servlet 的生命周期
  8. zip伪加密做法及原理
  9. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
  10. 十年磨一剑,阿里云RDS MySQL和AWS RDS谁的性能更胜一筹?
  11. Android view变形,Android SurfaceView预览变形完美解决方法
  12. vim 环境写 markdown 的插件推荐
  13. VB讲课笔记08:数组
  14. 幼儿抽象逻辑思维举例_四个锻炼幼儿推理能力的小游戏,让孩子的逻辑思维更上一层楼...
  15. 初学编程丨从零开始学习编程的基本路线,BAT程序员亲手总结!
  16. MSN在线代码|QQ在线客服代码|SKYPE 贸易通在线代码
  17. DataFrame案例--双均线策略
  18. 简单通用的Makefile
  19. 初学python--空函数、返回多个值
  20. 5G LTE窄带物联网(NB-IoT)8

热门文章

  1. 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}...
  2. oracle快速创建可用用户
  3. MVC5 Entity Framework学习参加排序、筛选和排序功能
  4. etcd v2文档(2) -- 客户端http请求管理集群成员api
  5. 美国DHS向国会提交政府《移动设备安全研究》报告
  6. 学习vue 20天,我写了点东西
  7. nagios安装文档
  8. web javascript开发 之Response.Write 与document.writ...
  9. 不同的载体 不同的商业模式
  10. 830. 较大分组的位置