经过一天的努力,终于把ThinkPHP的RBAC类弄明白了,现在记录下来,成果与大家分享。要想得到更详尽的信息,还需要去查看RBAC类的源代码。
首先需要使用5张数据表,关系图如下:
这五张表的英文名是任意的,只需修改相应的配置项就可以,默认的英文名分别为:用户表(think_user)、用户组表(think_role)、节点表(think_node)、用户与用户组关系表(think_role_user)、权限表(think_access)。
生成他们的sql语句如下(复制粘贴的):
~~~
CREATE TABLE IF NOT EXISTS `think_access` ( `role_id` smallint(6) unsigned NOT NULL, `node_id` smallint(6) unsigned NOT NULL, `level` tinyint(1) NOT NULL, `module` varchar(50) DEFAULT NULL, KEY `groupId` (`role_id`), KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_node` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `title` varchar(50) DEFAULT NULL, `status` tinyint(1) DEFAULT '0', `remark` varchar(255) DEFAULT NULL, `sort` smallint(6) unsigned DEFAULT NULL, `pid` smallint(6) unsigned NOT NULL, `level` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `level` (`level`), KEY `pid` (`pid`), KEY `status` (`status`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) DEFAULT NULL, `status` tinyint(1) unsigned DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `pid` (`pid`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `think_role_user` ( `role_id` mediumint(9) unsigned DEFAULT NULL, `user_id` char(32) DEFAULT NULL, KEY `group_id` (`role_id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
~~~
注意其中没有think_user表的生成语句,这张表在你编写“用户模型(User Model)”时自行创建,因为RBAC类不做类似于登录时用户名、密码是否匹配的工作。换句话说,检查用户名、密码是否匹配,该用户能不能成功登录的代码是你写的,你需要在用户成功登录后,将这个用户的ID写到相应的SESSION里,普通用户的写到$_SESSION[C('USER_AUTH_KEY')]里,管理员的写到$_SESSION[C('ADMIN_AUTH_KEY')]里。
接下来要说明的是几个相关的配置项:
~~~
// ADMIN_AUTH_KEY 管理员认证SESSION标记
// USER_AUTH_KEY 用户认证SESSION标记
//
// $_SESSION[C('USER_AUTH_KEY')] 用来保存登陆成功后的用户ID
// $_SESSION[C('ADMIN_AUTH_KEY')] 用来保存登陆成功后的管理员ID
//
// USER_AUTH_ON 是否需要认证
// USER_AUTH_TYPE 认证类型,1是登陆认证,2是实时认证
// USER_AUTH_MODEL 用户模型名称
// GUEST_AUTH_ON 是否开启游客授权访问
// GUEST_AUTH_ID 游客的用户ID
//
// REQUIRE_AUTH_MODULE 需要认证模块(若定义了,则只验证给出的模块;否则验证所有模块)
// NOT_AUTH_MODULE 无需认证模块(若定义了“需要认证模块”则本条定义无效)
// REQUIRE_AUTH_ACTION 需要认证操作(若定义了,则只验证给出的操作;否则验证所有操作)
// NOT_AUTH_ACTION 无需认证操作(若定义了“需要认证操作”则本条定义无效)
//
// USER_AUTH_GATEWAY 认证网关,如果用户没有登录则转到这页(URL路由规则)
// RBAC_DB_DSN 数据库连接DSN
// RBAC_ROLE_TABLE 角色表名称
// RBAC_USER_TABLE 用户表名称(应该是用户、用户组关系表)
// RBAC_ACCESS_TABLE 权限表名称
// RBAC_NODE_TABLE 节点表名称
~~~
在定义了这几项之后,就可以调用RBAC类中的方法了,这些方法的声明及解释如下:
1.
`static public function authenticate($map,$model='')`
根据map中指定的条件查询“用户模型”,返回符合条件的数据。其实就是M(User)->where($map)->find()。
2.
static function saveAccessList($authId=null)
检测当前用户的所有权限,并将这些拥有的权限保存在$_SESSION['_ACCESS_LIST']中,不返回任何东西。开销很大,是对RBAC::getAccessList的默认参数封装。
3.
`static function getRecordAccessList($authId=null,$module='')`
检测当前用户在当前模块中所拥有的权限,并将这些权限返回。开销很大,是对getModuleAccessList的默认参数封装。
4.
`static function checkAccess()`
检查当前操作是否需要认证,需要认证则返回true,不需要则返回false.
5.
static public function checkLogin()
检查用户是否登录。如果没有登录,则尝试进行“游客”登录;如果没有开启以游客身份登录,则跳转到认证网关。登录成功将返回true。
6.
`static public function AccessDecision($appName=APP_NAME)`
权限认证的过滤器方法,检查当前操作是否被允许,返回bool值。
7.
`static public function getAccessList($authId)`
取得指定用户的权限列表。
8.
`static public function getModuleAccessList($authId,$module)`
取得指定用户、指定模块的权限列表。
- 前端工程师
- HTML
- 使用meta实现页面的定时刷新或跳转
- 表单相关
- 表单元素input、按钮、文字完美垂直居中对齐方法
- CSS
- 相关工具网站
- JS
- jQuery
- 第1章 初始jQuery
- 环境搭建
- jQuery对象与DOM对象
- jQuery对象转化成DOM对象
- DOM对象转化成jQuery对象
- 第2章 jQuery选择器
- id选择器
- 类选择器
- 元素选择器
- 全选择器(*选择器)
- 层级选择器
- 基本筛选选择器
- 内容筛选选择器
- 可见性筛选选择器
- 属性筛选选择器
- 子元素筛选选择器
- 表单元素选择器
- 表单对象属性筛选选择器
- 特殊选择器this
- 第3章 jQuery的属性与样式
- 元素的数据存储
- 问题解决方案
- 解决innerHTML包含的js代码不能被执行的问题
- webpackdoc
- 前端开发框架
- Bootstrap 3.3.6
- 起步
- 全局 CSS 样式
- 概览
- 栅格系统
- PHP
- PHP入门篇
- 基础总结
- PHP环境变量$_SERVER和系统常量详细说明
- PHP进阶篇
- 数组
- 函数
- 类
- 字符串操作
- 正则表达式
- 会话控制
- 文件系统
- 日期和时间
- 图形图像操作
- PHP异常处理
- 数据库操作
- WEB在线文件管理器
- PHP文件操作
- 获取首层目录信息
- 获取文件信息
- 列表显示文件及大小
- PHP与MySQL关系大揭秘
- PHP支持哪些数据库
- 数据库扩展
- 连接MySQL数据库
- 执行MySQL查询
- 插入新数据到MySQL中
- MVC架构模式分析与设计
- Smarty模版语法
- Smarty的基本语法
- Smarty的条件判断语句
- Smarty的循环语句
- Smarty的文件引用
- Smarty类和对象赋值与使用
- Smarty函数的使用
- functions函数插件的定义和使用
- modifiers变量调节器插件的定义和使用
- block functions区块函数插件的定义和使用
- Smarty实例
- MVC微型框架的建立
- 网络摘抄
- PHPExcel如何读取超大excel文件
- Composer
- Composer技巧
- PHP 开发者该知道的 5 个 Composer 小技巧
- composer常用命令
- Composer使用方法整理(Cy23)
- 利用Composer一步一步搭建自己的PHP框架
- ThinkPHP
- ThinkPHP中RBAC类详解(一)
- 附:添加注释版RBAC类源码
- 常见问题
- 常见方法
- thinkphp 合并两个字段组合成一个临时字段concat函数
- ThinkPHP Where 条件中使用表达式
- 编程相关工具
- Eclipse
- Eclipse或Zendstudio汉化
- Zend studio
- Zendstudio快捷键
- Zend Studio实用快捷键一览表
- Sublime text
- Sublime text快捷键
- 16 个 Sublime Text 快捷键
- Emmet的用法及相关语法
- VS Code
- 数据库
- MySql
- 问题汇总
- mysql创建存储过程失败1307错误解决
- Mysql出现Field * doesn't have a default value解决办法
- mysql:ADO连接mysql数据库,驱动程序和ODBC数据源问题
- 自己如何正确获取MYSQL的ADO连接字符串
- 网上摘抄
- mysql 存在更新 不存在插入
- Mysql字符串字段中是否包含某个字符串,用 find_in_set
- mysql字段类型对应的数字编号
- 5.7mysql group分组查询错误问题
- mysql常用操作语句
- SQL2005
- SQL常见错误
- 使用 sp_change_users_login 修复产生的孤 立账户 & 还原中的孤立用户
- ASP
- Url编码解码函数合集 含utf-8和gb2312
- 其他前端相关技巧
- 联机查看 Office 文档
- 服务器配置
- windows
- 服务器安装
- XAMPP自带TOMCAT插件可以支持php+java
- IIS
- iis7服务器,客户端无法下载exe文件的解决之道
- Linux
- ubuntu
- Linux安装JDK
- 辅助开发工具
- Git