yii2权限控制rbac之菜单menu最详细教程

前面咱们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,若是你尚未实现,请先看上文再回来参考本文,由于本文是在上文的基础上进行完善和补充。php

先认个错,罪过了,你将要看的这篇教程是菜单权限的扩展,若是你的菜单出不来,非常建议你参考 yii2 rbac权限控制详细操做步骤html

部分小伙们纷纷反映,最后菜单menu怎么控制权限呀,看不懂,搞不定,并且你那貌似没搞完,瞎忽悠!确实没那么全,今天看咱们如何实现菜单完美权限化。先罗列下主要讲的内容,不须要的不必看下去,只为分享给有须要的人。json

  • 利用menu表添加菜单
  • 左侧菜单结果adminlte完美呈现
  • 菜单前面自定义icon小图标并呈现
  • 如何控制菜单的显示或者隐藏
  • 多控制器激活当前菜单
  • 页面操做按钮没权限的不作显示
  • gridview中也只显示有操做权限的按钮

嗯,差很少就这么多,若是你还有其余的有关权限控制菜单的需求,请下方留言,我们共同切磋交流。yii2

先看图预览下大体效果,否则怎么激起大家好学的心。app

71bbc0564d-yii2rbacmenu.png

首先咱们先访问路由页面 /admin/route/index ,尽量的把左侧的所有选中,而后移动到右侧,,而后记得给当前用户分配相关的可访问权限哦。框架

接下来访问菜单列表 /admin/menu/index 点击添加菜单,若是这个时候你没有权限访问了,请你在配置文件的 as access文件内暂时容许当前用户访问任意权限,并在咱们添加完权限的时候去掉as access的设置,必定要记得哦,否则权限失效了可别回来找我。yii

c4c812b7fa-yii2rbacmenu2.png

这里咱们先填写上图中标红的四个字段ide

举个例子:咱们要添加一级菜单"权限管理"测试

名称请填写"权限管理",由于是一级菜单,父级名称请留空,路由咱们这里选择"/admin/default/index",注意了,若是匹配到任何路由,请访问路由页面把左侧的选中移动到右侧。优化

映射,其实就是排序高低的问题,好比说我添加了两个菜单,映射值为1的就在上面 值为2的就在1的下面,咱们这里填写数字1。

"数据"这一项咱们后面再说。

按照刚刚介绍的这种方式添加吧,举一个添加二级菜单"权限控制"的例子

只须要把父级名称这里填写咱们刚刚添加成功的一级名称"权限管理"便可。其余照旧。不会操做的多看两遍,这里最好把权限管理的几个菜单所有添加完毕,由于接下来咱们须要且你能够多练练手嘛。

到此咱们已经会添加菜单了。

咱们来看下一步,利用咱们以前搭建的后台框架进行展示。

use mdm\admin\components\MenuHelper; 
echo dmstr\widgets\Menu::widget( [
     'options' => ['class' => 'sidebar-menu'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id), 
] );

是否是很简单,What?个人怎么没有dmstr这玩意,很差意思,已经说的不少遍,须要先看上文再有这个菜单的结合。

ok,刷新页面看看你的菜单,虽然咱们还没彻底实现咱们想要的功能,不过到此你应该能看到你的菜单展示了。

接下来将进入咱们的重点以及难点,咱们要实现菜单前面的小图标且完成菜单可隐藏控制。

还记得咱们一开始建立菜单的时候,惟一没进行填写的选项"数据"吗?为了后续操做方便,咱们这里一并把图标和隐藏的选项都填写上。咱们以开始截图中的"后台用户管理"这个二级菜单为例进行修改。截图你们先看看咱们的菜单目前的状态,

76ec936ec5-yii2rbacmenu3.png

请在其更新页面的“数据”项中务必填写下面的代码,若是你有新的想法,还请先按照个人思路后面再作修改,由于后面咱们要进行操做。

{"icon": "fa fa-user", "visible": false}

是的,这个"数据"项咱们填写的是一段json代码,接下来咱们对展现菜单的代码也作稍微的整改,为了方便你们看代码,这里的$callback直接写在页面上了,回头你们能够继续封装优化。

use mdm\admin\components\MenuHelper; 
<?php 
$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; 
}; 
//这里咱们对一开始写的菜单menu进行了优化
echo dmstr\widgets\Menu::widget( [ 
    'options' => ['class' => 'sidebar-menu'], 
    'items' => MenuHelper::getAssignedMenu(Yii::$app->user->id, null, $callback), 
] ); ?>

是的,你没有看错,代码是有点长,咱们来简单分析分析。其实咱们这里的$callback方法也只是针对上面咱们添加菜单的"数据"项进行的分析。不难看出,咱们对icon和visible分别进行了判断,并追加到当前menu中。

到此,咱们费了一番波折终于实现菜单加icon和设置菜单的隐藏。若是你有其余的属性须要进行配置,此处仍然能够继续单独配置。

关于多控制器的激活,什么意思呢?我来阐述两句。

好比说咱们如今要访问的菜单,其路由是/test/index,若是正常激活菜单的话,当咱们访问/test/*的时候,其对应的左侧菜单天然会处于激活状态,可是,咱们想要的一种效果是,当访问/test2/*(注意哦,这里是test2另一个控制器)的时候咱们也想要激活当前菜单/test/index怎么办好呢?为了文章的阅读性更强,该问题属于后期增添的,若是你有兴趣,请移步yii2左侧菜单子级没法高亮的问题参考。

如今,咱们还有两个任务仍待完成,要完成接下来的两个任务,为了你们的方便,建议你的项目能够自定义配置gii模版,不支持自定义gii模板的能够参考自定义gii模版 当你发现咱们后面须要作的功能,我以为你会赞叹咱们这里的操做。

为了方便操做,咱们这里增长一个测试表test,咱们先用未作修改的gii模版生成一份model+curd。咱们先把test/*的全部权限分配给当前登陆的用户,并添加一条数据。打开/test咱们能够正常看到下面的截图,注意图中的两个标记。

6d11862d85-yii2rbacmenu4.png

 

而后咱们打开test/index.php文件,对标记的两个地方进行以下修改

use mdm\admin\components\Helper; 
<?php 
//没有建立权限不显示按钮 
if(Helper::checkRoute('create')) { 
    echo Html::a('Create Test', ['create'], ['class' => 'btn btn-success']); 
} ?> 
<?= GridView::widget([ 
    // ...... 
    'columns' => [ 
        // ...... 
        [ 
            'class' => 'yii\grid\ActionColumn', 
            'template' => Helper::filterActionColumn('{view}{update}{delete}'), 
        ], 
    ], 
]); ?>

如今咱们刷新下页面/test再看看,好像没什么变化嘛。别急,咱们如今撤销当前用户的/test/create 权限和/test/update权限,而后你在刷新下页面看看效果,咱们截图看看。

352a3c8b81-yii2rbacmenu5.png

 

也就是说咱们没有权限的按钮消失了,当你手动访问/test/create的时候你会发现也会提醒你没有权限。

若是你的gii模板是自定义的,相信你会迅速在其生成的模板中全部的操做上添加权限控制的,是否是很happy

最后,咱们的菜单menu关于权限控制的讲解基本也就结束了,长篇大论,仔细回想起来也没多少东西,却是但愿能帮到你一二

相关文章
相关标签/搜索