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

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

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

    一篇用心写的 yii2-admin 手册类文章。

    开篇

    首先要说的是 yii2 的 rbac 扩展并不多,yii2-admin 算最好的了,网上关于它的介绍也少之又少,好吧,今天北哥就吐它几口老血,整一篇,请各兄弟仔细读读。

    适合读者 对 yii2 的 rbac 有一点了解,起码知道几张数据表吧。

    先说目录

    • yii2-admin 是个啥
    • 安装和关键点配置
    • yii2-admin 布局的使用
    • yii2-admin 为何多了一层 route,是咋回事?
    • 用 yii2-admin 配置带角色的会员系统
    • 用 yii2-admin 配置聪明的菜单

    yii2-admin 是个啥

    先报官方地址: https://github.com/mdmsoft/yii2-admin

    从用途上将,它是一个 yii2 rbac 权限系统,我们不用自己写代码,按照 yii2-admin 的要求,安装下然后点一点,一个完善的权限系统就出来了,yii\rbac 这个命名空间下的各种类构成了 yii2-admin 强劲的血脉,bootstrap 给了它一套简洁华丽的外表,表里如一。

    从性质上说,它是一个 composer 的扩展,所以你安装它并不复杂,它居住在应用程序的 vendor 小区,门牌号为 mdmsoft/yii2-admin,别找错门。

    从结构上说,yii2-admin 是一个 yii2 的模块,拥有完善的 MVC,有资源,有 migration,有组件,啥都有。

    最后总结一下 yii2-admin 是一个 yii2 的模块,实现可视化 rbac 管理功能,依托于 composer 进行安装和升级,ok,亮相完毕,贴几个图,露露脸。

    源码位置

    一张截图

    安装和关键点配置

    yii2-admin 使用 composer 可以一键安装,当然就算没有你也可以进行归档文件手工安装。

    composer 安装

    稳定第一,虽然 yii2-admin 现在有 v3 版本,但是作者不再维护此分支,我推荐大家使用 v2 版本,这个分支的更新速度还是很稳定的。

    composer require mdmsoft/yii2-admin "~2.0"
    

    此刻 composer 为我安装了最新的 2.7 版本

    alt

    归档文件安装

    第一步 在这里下载版本(最新的为 v2.7 ) https://github.com/mdmsoft/yii2-admin/releases

    第二步 设置一个别名

    // config/web.php 里
    'aliases' => [
    	'@mdm/admin' => 'path/to/your/extracted',
    	// for example: '@mdm/admin' => '@app/extensions/mdm/yii2-admin-2.0.0',
    	...
    ]
    

    提醒 aliases 的位置和 components 同级,不要放错位置。

    到此刻位置,无论何种方式,我相信 yii2-admin 已经进入到你的系统了。

    配置

    接下来进入本文的第一次配置,前面我们说了,yii2-admin = rbac + module + composer,所以你一定懂得下面我做的事情。

    // config/web.php
    // 配置模块
    'modules' => [
    	'admin' => [
    		'class' => 'mdm\admin\Module',
    		...
    	]
    	...
    ],
    // 配置权限
    'components' => [
    	...
    	'authManager' => [
    		'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\PhpManager'
    	]
    ],
    'as access' => [
    	'class' => 'mdm\admin\components\AccessControl',
    	'allowActions' => [
    		'site/*',
    		'admin/*',
    	]
    ],
    

    这是最基本的配置,它能让 yii2-admin 运行起来,modules 和 authManager 你应该懂(不懂的看下 c14 这个专题视频,讲解 rbac 细节东东),这里说明下 as access 的功能。

    as access 是个啥? 大家可以看下 mdm\admin\components\AccessControl 类,我贴一部分出来说

    
    namespace mdm\admin\components;
    
    use ...
    
    /**
     * Access Control Filter (ACF) is a simple authorization method that is best used by applications that only need some simple access control. 
     * As its name indicates, ACF is an action filter that can be attached to a controller or a module as a behavior. 
     * ACF will check a set of access rules to make sure the current user can access the requested action.
     *
     * To use AccessControl, declare it in the application config as behavior.
     * For example.
     *
     * ```
     * 'as access' => [
     *     'class' => 'mdm\admin\components\AccessControl',
     *     'allowActions' => ['site/login', 'site/error']
     * ]
     * ```
     */
    class AccessControl extends \yii\base\ActionFilter {
    	...
    }
    

    重点在于注释部分,它是 acf,而一般来说 acf 的控制规则都会在控制器或模型的 behavior 方法里设置,当然我们也可以在配置文件中用 as access 的形式整个 app 进行规则限制。

    重点在于下面这句

    'allowActions' => [
    	'site/*',
    	'admin/*',
    ]
    

    allowActions,什么意思那? site 控制器下的所有 action 以及 admin 模块可以跳过 yii2-admin 的权限控制,你可以在里面添加其他的路由。

    总之在此刻你要做的是记住它即可,后面我们会对 acf 等有说明。

    好了,现在看看访问的情况,yii2-admin 给出了一些它的 url,如下

    http://localhost/index.php?r=admin
    http://localhost/index.php?r=admin/route
    http://localhost/index.php?r=admin/permission
    http://localhost/index.php?r=admin/menu
    http://localhost/index.php?r=admin/role
    http://localhost/index.php?r=admin/assignment
    http://localhost/index.php?r=admin/user
    

    访问 /index.php?r=admin,你会成功看到 yii2-admin 运行的默认页面,第一步大功告成。

    alt

    yii2-admin 布局的使用

    默认情况下,yii2-admin 使用应用程序的布局,当然它自己也带有 4 个布局,分别是 left-menu、main、right-menu、top-menu 这样子。

    我们可以在 web.php 的模块布局配置中指定他们,比如我现在要使用 left-menu 的。

    'modules' => [
    	'admin' => [
    		'class' => 'mdm\admin\Module',
    		'layout' => 'left-menu'
    	],
    ],
    

    看看运行图

    alt

    基本上就是多了一个菜单这么个玩意,其他的比如 top-menu、right-menu 就是菜单位置不同而已,各位兄弟可以自己尝试下。

    再说一点,既然 yii2-admin 是一个模块,那其实我们很容易就能找到这些布局所在,看图。

    alt

    看明白了吧,记住 yii2-admin 是什么! yii2-admin = rbac + module + composer,遇到不懂的地方往这三个上面靠,会比较容易理解。

    这就是布局,比较简单,这部分过。

    为何多了一层 route - 1

    如果你对 yii2 的 rbac,或者说你对任何一个框架的 rbac 有了解,都应该知道在 rbac 中有如下名词

    • 角色
    • 权限
    • 关系
    • 资源
    • 规则

    而看我们的 yii2-admin,你如果操作下会发现,它多了一个 route,route 属于某个权限或角色,这是咋回事? route 是个毛?

    alt

    现在我帮你顺一顺,我们说 rbac 中最终操作的是资源,而一个资源在 yii 中其实就是一个 action,比如你能编辑商品其实是你有没有访问 goods/edit 的权限,而这些不就是路由么,路由最终定位到 action,定位到资源。

    这就是为何 yii2-admin 要引入路由的概念,其实它是在定义资源,毕竟作为一个通用性的权限管理,总不能让我们自己去 action 里做代码吧。

    那么问题又来了? 我们 yii2 的 rbac 只有四张表,并没有路由表,那么 yii2-admin 是如何玩转这个东东的那?

    奥秘下节为你揭晓,从源码的角度告诉你 route 的逻辑实现。


    签名档

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