V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abei
V2EX  ›  PHP

北哥这篇文讲解 yii2 权限扩展( yii2-admin) - 中部

  •  
  •   abei · 2017-08-07 16:34:21 +08:00 · 2621 次点击
    这是一个创建于 2662 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本篇继续讲解 yii2-admin 扩展

    上一篇 m155 我们讲解了 yii2-admin 的安装、布局和简单的配置,本节我们重点讲解 route 的实现以及整个 rbac 操作流程。

    本章要讲的内容如下

    • yii2-admin 为何多了一层 route,是咋回事?
    • 用 yii2-admin 配置带角色的会员系统

    继续说 route 及 Permissions

    上一节我们说了 yii2-admin 多出 route 层,但是 yii2 的 rbac 数据表中并没有相关的表,本节我们讨论下 route 是如何处理的以及它和 persission 的关系。

    而我们使用 yii2-admin 也是从添加 route 开始的,打开 index.php?r=admin/route

    alt

    自动检索

    首先看 ① 处,yii2-admin 会自动帮我们把 yii2 程序的所有路由全部分析并列举出来供选择,当然你也可以在 ④ 处自行添加,但是有一点要注意

    在你自己添加路由的时候,务必且必须以 / 开始,否则它会带来很多麻烦问题。

    对于自动检索处的路由,我们可以通过 ② 操作将其添加到 ③ 区域。对于自动添加的路由它会自己进入到 ③ 区域。

    就想我下面动图展示的一样

    操作流程

    当然,如果是自己添加的,你在自动检索区①处是看不到的。

    当我们从自动检索区添加一个到 ③ 区域,或自行添加后,rbac 系统发生了什么那?

    其实它填充了 item 表,如下图

    是的,这货就是权限

    是的,这货就是权限,但如果它是权限,那 yii2-admin 的权限又是干嘛的?别急,我们熟悉下 yii2-admin,顺完会为大家揭晓。此坑必填。

    Permissions

    我们来看 Permissions 菜单。现在我们来生成一个 Permission。

    新增权限

    号外,因本章并不是讲解 yii2 rbac 内容,北哥假设你对 yii2 rbac 已经有所了解,如果不了解可以看下 rbac 系列视频

    Route 和 Permissions 的关联就在于我们新联了一个权限后,当新建一个权限后,yii2-admin 需要让我们为此权限指定对应的路由,不明白?看图,看图最直观。

    为权限指派路由

    上图的目的是什么?我们知道,路由就是资源,我们现在在为一个权限指派资源,当然你理解为权限可以属于另一个权限也没有问题。

    当我们把路由 /goods/index 指派给 权限 goods-edit 后,将来拥有 goods-edit 权限的人就能访问 /goods/index 了。

    接下来我们看看为权限指路由后,rbac 数据表的变化

    item 表变化

    关系已经建立

    是的,权限之间的所属关系已经建立。

    填一个坑

    接下来我们来填上文的一个坑,当我们为一个权限分配路由的时候,从数据表我们知道他们都是权限,那么在每个权限页面又如何分析出路由项而没有混入普通的权限那。这个情况在路由页面的 ③ 区域我想你也感觉到了。

    这是为什么那?

    其实很简单,这要看下 yii2-admin 的一个方法

    // /vendor/mdmsoft/yii2-admin/models/searchs/AuthItem.php 52 行
    public function search($params)
    {
    	/* @var \yii\rbac\Manager $authManager */
    	$authManager = Yii::$app->getAuthManager();
    	if ($this->type == Item::TYPE_ROLE) {
    		$items = $authManager->getRoles();
    	} else {
    		$items = array_filter($authManager->getPermissions(), function($item) {
    			return $this->type == Item::TYPE_PERMISSION xor strncmp($item->name, '/', 1) === 0;
    		});
    	}
    	$this->load($params);
    	....
    

    对,就是其中的 strncmp($item->name, '/', 1) === 0 这句,这个方法搜索出了所有的权限列表,然后筛选出这些权限名字中第一个字符是 / 的,这也是为何我们说添加路由的时候必须 / 开头的原因。

    ok。

    其他操作

    关于如何建立角色等就不做详说,关于 rule 我们会放到最有一篇说。

    角色的建立和赋予权限

    为会员分配角色

    通过对上面的学习,我们学会了如何新建权限和路由,如何建立角色并分配相关权限,万里长征走完了第一步,下面我们来为 yii2 程序的会员分配角色和权限。

    你一定发现了,yii2-admin 并没有一个 user 的菜单?不是没有,是没有配置而已。

    配置 user

    我们需要使用 yii2-admin 提供的会员模型,数据表已经为我们准备好

    // 导入数据表 命令行运行
    ./yii migrate --migrationPath=@mdm/admin/migrations
    

    两张表

    你也可以复制 /vendor/mdmsoft/yii2-admin/migrations 对应的数据库 sql 脚本导入。

    这个行为会导入两张表,我们先用其中的 user 表,menu 会在下一节权限菜单中使用。

    yii2-admin 会自动检测数据库中是否有对应表而陈列出对应的菜单,现在你打开 index.php?r=admin 后,是不是多了 user 和 menu 菜单了。

    菜单

    接下来我们需要设置下 web.php

    //在 user 模块里
     'user' => [
    	'identityClass' => 'mdm\admin\models\User',
    	'loginUrl' => ['admin/user/login'],
    ]
    

    当你配置完以后会发现 admin 又多了一个叫做 Assignments 的菜单。不过此刻我们的系统中是没有会员数据的,别担心,yii2-admin 提供了一个 action 让我们生成会员。

    index.php?r=admin/user/signup

    注册会员

    赶紧去建立几个会员吧

    分配角色

    现在有了会员,选择 Assignments 菜单中的某个会员,我们就可以轻松的为他分配角色和权限了

    alt

    此刻我为会员 abei 分配了角色“客服人员”,它具有 goods-edit(可以访问 /goods/index 路由) 但是不能访问 /goods/delete

    效果演示

    这就是 rbac 的会员、角色、权限、资源的关系。

    说了好多,大家也很累了,先这样,下一篇继续聊 yii2-admin 的 user 和 menu 两块。


    签名档

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3334 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:24 · PVG 19:24 · LAX 03:24 · JFK 06:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.