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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值