yii2项目实战-yii自带rbac数据表分析
更新于 2016年09月13日 by 白狼 被浏览了 1724 次

上一篇文章中,我们了解到了什么是基于角色的访问控制。如果让我们自己实现一套基于角色的访问控制,我们又该如何设计,如何开发呢?

开发之前有必要先来分析一下数据表:

  1. 首先主体,也就是用户,需要有一张用户表,很简单,我们已经有了,就是数据表user_backend
  2. 我们需要有一张角色表和权限表,分别存放角色和权限的数据表
  3. 另外我们还需要一张主体跟角色的关联表,也就是需要给用户分配角色的存储表
  4. 最后我们再需要一张角色跟权限的关联表

也就是说,如果现在让我们自己从零开始实现一套基于角色的访问控制,我们总结了上面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,期待吧!