上一篇文章中,我们了解到了什么是基于角色的访问控制。如果让我们自己实现一套基于角色的访问控制,我们又该如何设计,如何开发呢?
开发之前有必要先来分析一下数据表:
首先主体,也就是用户,需要有一张用户表,很简单,我们已经有了,就是数据表 user_backend
我们需要有一张角色表和权限表,分别存放角色和权限的数据表
另外我们还需要一张主体跟角色的关联表,也就是需要给用户分配角色的存储表
最后我们再需要一张角色跟权限的关联表
也就是说,如果现在让我们自己从零开始实现一套基于角色的访问控制,我们总结了上面4小条。
开始之前很多人会觉得很难,无从下手,现在感觉呢,是不是思路清晰了很多?
开始本篇主题之前有必要再叨唠两句。有些同学学蒙了,为啥这个时候说这些有的没的呢,不是要学实战吗?其实我们现在步步都在实战,网上你也找不到这么好的教程呢!我们现在就是在为后面的课程做一些铺垫,因为很多人后面构建好了rbac,但是却不明白其前因后果!尤其重要的是,很多人需要自己从零构建rbac,真到那个时候你再想想现在,可真够幸运的呢。
所以,这里基础的理解很重要!
言归正传。官方自带的rbac在哪呢?在 vendor\yiisoft\yii2\rbac 目录下。
还记得我们之前讲的migrate的用法吗?接下来我们又要用到migrate生成官方自带的数据表了。(部分同学直接拷贝sql执行,但是sql本身未设定utf8模式,导致后面乱码,此处我们统一使用migrate进行操作)
CLI模式即命令行模式下,在vendor同级目录执行以下命令1
./yii migrate --migrationPath=@yii/rbac/migrations/
windows用户请执行以下命令1
yii migrate --migrationPath=@yii/rbac/migrations/
回车后输入yes..然后报错了,报错不可怕,可怕的是错误摆在我们面前我们仍然视而不见!来,我们看看具体的报错信息1
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的配置不要写错哦。1
2
3
4
5//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,期待吧!