上一篇介绍了 yii 权限控制(yii-admin 和 rabc的安装)
这一篇将介绍 rabc 的使用和配置:
首先我们先让菜单显示出来我们需要操作的菜单。这里后台还是基于 adminLTE
修改 backend/views/layouts/left.php 添加代码:
[
'label' => '权限控制',
'icon' => 'sitemap',
'url' => '#',
'items' => [
['label' => '后台账户', 'icon' => 'user', 'url' => ['/adminuser/index'],],
['label' => '路由', 'icon' => 'dashboard', 'url' => ['/admin/route'],],
['label' => '权限', 'icon' => 'dashboard', 'url' => ['/admin/permission'],],
['label' => '角色', 'icon' => 'dashboard', 'url' => ['/admin/role'],],
['label' => '分配', 'icon' => 'dashboard', 'url' => ['/admin/assignment'],],
['label' => '菜单', 'icon' => 'dashboard', 'url' => ['/admin/menu'],],
],
],
保存后在后台就可以看到我们要的菜单了。
参考博客:http://www.manks.top/article/yii2_rbac_description
1.首先配置可分配权限的路由: (访问地址大致为:index.php/admin/route/index)
我这里已经把所有的移动到右侧了,你可以根据自己的需求,决定是否移动到右侧,用于后续配置分配权限。
2.配置权限(index.php/admin/permission/index)
举例:
保存后查看权限菜单,就可以看到刚才添加的权限了,点击小眼睛图标为他分配可操作的路由
3.创建角色(index.php/admin/role/index)
保存完成后,就可以看到刚才添加的角色了,点击小眼睛图标为他分配权限
如图,我为他分配了刚刚创建的后台账户管理权限
5.分配(index.php/admin/assignment/index)
选择你需要分配权限的后台账户,点击小眼睛图标
6.全都分配完毕后,你可以尝试把 配置文件的 as access 中 allowActions 值去掉
'as access' => [
'class' => 'mdm\admin\components\AccessControl',
'allowActions' => [
//'*',
]
],
为了方便配置和管理,我其实先创建了一个超级管理员权限,然后分配 /* 所有权限给他。
可以在另一个浏览器打开后台登录 admin2账户看下,这个时候你可以管理adminuser 但是其它比如路由等点击就会报 403 无权限。
但我们可能希望权限改变的同时账户可操作对的菜单也是根据权限显示的,那么这就需要菜单管理模块了。
配置菜单:(index.php/admin/menu/index)
1.名称是菜单显示的名称
2.排序值越小越靠前
3.父级名称(例如一个菜单“菜单配置”是 菜单管理的子菜单,那么创建菜单配置菜单的时候父级名称就填写“菜单管理”)
4.路由是菜单的链接(路由一定要填写分配权限的时候显示的那些路由,填错是保存不上的)
5.数据用于一些自定义配置这里:{"icon": "dashboard", "visible": true} 之后会介绍用途
保存后我们需要修改代码让他显示出来:
layouts/left.php 添加use:
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'] = 'circle-o';
$items && $return['items'] = $items;
return $return;
};
echo dmstr\widgets\Menu::widget(
[
"encodeLabels" => false,
"options" => ["class" => "sidebar-menu"],
"items" => MenuHelper::getAssignedMenu(Yii::$app->user->id,null,$callback),
]
);
?>
此时再次刷新后台就可以看到我们添加的菜单管理了。
其中注意添加了 callback 就是为了实现我们的自定义数据的。
页面中的权限配置和可操作动作显示:
例如后台账户管理的页面:(新增账户需要有create权限,同理view update delete等权限)
那么修改账户管理模块的 views/xxx/index.php 创建按钮处修改代码为:
<?php if(Helper::checkRoute('create')) {?>
<p>
<?= Html::a('创建后台用户', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?php }?>
grid 的actionCloumn 修改为:
[
'class' => 'yii\grid\ActionColumn',
'template' => Helper::filterActionColumn('{view}{update}{delete}'),
],
这样当你登录的账户没有相应权限的时候是不会显示相应的操作的。
到此后台的菜单和权限基本介绍完了。
另外说下,如果我们的需求是有些controller 允许不登录访问,那么在as access 添加额外配置即可。
如果未登录的情况下访问除了登录以外的页面会被跳转到登录页的
程序实现在:
首先 as access 配置了 ‘class’ => ‘mdm\admin\components\AccessControl’,
然后查看 这个类:
有个 beforeAction函数
public function beforeAction($action)
{
$actionId = $action->getUniqueId();
$user = $this->getUser();
if (Helper::checkRoute('/' . $actionId, Yii::$app->getRequest()->get(), $user)) {
return true;
}
$this->denyAccess($user);
}
基本上是 checkRoute 看用户是否有这个路由的权限没有则 denyAccess
protected function denyAccess($user)
{
if ($user->getIsGuest()) {
$user->loginRequired();
} else {
throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
}
}
这个函数判断是否登录,登录了报权限错误,未登录调用 $user->loginRequired(); 这里实现了 跳转到登录页。
此文章通过 python 爬虫创建,原文是自己的csdn 地址: yii2 rabc 的使用和配置