作者:白狼 出处:http://t.cn/Rci0GxS 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 上一篇文章中,我们了解到了什么是基于角色的访问控制。如果让我们自己实现一套基于角色的访问控制,我们又该如何设计,如何开发呢?
开发之前有必要先来分析一下数据表:
- 首先主体,也就是用户,需要有一张用户表,很简单,我们已经有了,就是数据表user_backend
- 我们需要有一张角色表和权限表,分别存放角色和权限的数据表
- 另外我们还需要一张主体跟角色的关联表,也就是需要给用户分配角色的存储表
- 最后我们再需要一张角色跟权限的关联表
也就是说,如果现在让我们自己从零开始实现一套基于角色的访问控制,我们总结了上面4小条。开始之前很多人会觉得很难,无从下手,现在感觉呢,是不是思路清晰了好多?开始本篇主题之前有必要再叨唠两句。有些同学学蒙了,为啥这个时候说这些有的没的呢,不是要学实战吗?其实我们现在步步都在实战,网上你也找不到这么好的教程!我们现在就是在为后面的课程做一些铺垫,因为很多人后面构建好了rbac,但是却不明白其前因后果!所以,这里基础的理解很重要!
言归正传。官方自带的rbac在哪呢?在 vendor\yiisoft\yii2\rbac 目录下。
还记得我们之前讲的migrate的用法吗?接下来我们又要用到migrate生成官方自带的数据表了。(部分同学直接拷贝sql执行,但是sql本身未设定utf8模式,导致后面乱码,此处我们统一使用migrate进行操作)
在vendor同级目录,也就是我们项目的顶级目录下执行
./yii migrate --migrationPath=@yii/rbac/migrations/
然后输入yes..然后报错了,报错不可怕,可怕的是看到错误的人躲着错误问这问那!我们看看具体什么错
Exception 'yii\base\InvalidConfigException' with message 'You should configure "authManager" component to use database before executing this migration.'
提示我们说在执行这条migration之前让我们先配置下authManager组件!也就是说我们尚未配置某些操作,那我们就配置下authManager组件呗
打开common\config\main.php文件,在components数组中加入authManager组件
//authManager有PhpManager和DbManager两种方式,
//PhpManager将权限关系保存在文件里,这里使用的是DbManager方式,将权限关系保存在数据库.
"authManager" => [
"class" => 'yii\rbac\DbManager',
],
然后我们再次执行上面的migrate命令,控制台提示我们成功创建了4张数据表,我们打开数据库看了下,果真如此。
数据表我们是一股脑的创建完了,但是每个数据表具体什么含义呢?是否真的就如我们一开始所分析的呢?
auth_item:用于存储角色、权限和路由
auth_item_child:角色-权限的关联表
auth_assignment:用户-角色的关联表
大致上跟我们所分析的差不多,只不过关于角色、权限这里共用了一张数据表,统称为授权项目。
说明一下:上面说的路由,实质就是我们权限所控制的最小粒度范围。那为什么要写角色、权限和路由呢?角色,可以理解为可为其分配的是角色更大级别的,权限,可以理解为角色的浓缩版,实质就是一个角色,只不过关联的是最小粒度-路由。
需要提醒的是:4张数据表的表名分别对应着authManager组件类yii\rbac\DbManager的4个属性,也就是说如果我们在authManager中配置了不同的属性值,生成的数据表名也会随之改动,可自行尝试!
下一章节,我们利用刚刚配置的authManager组件,直接手把手带你飞,手动敲出一个简单强大的权限管理,让rbac变的so easy,期待吧!
[考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导!]
来源:oschina
链接:https://my.oschina.net/u/2486665/blog/768245