文档章节

ThinkPHP中RBAC类详解(一)

摇滚哈哈狗
 摇滚哈哈狗
发布于 2015/01/01 21:39
字数 1088
阅读 30
收藏 0

    经过一天的努力,终于把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)

取得指定用户、指定模块的权限列表。

本文转载自:http://www.cnblogs.com/cxgzs/archive/2013/01/11/2856704.html

摇滚哈哈狗
粉丝 14
博文 226
码字总数 28445
作品 0
深圳
程序员
私信 提问
ThinkPHP 3.0 + Rbac 应用示例

此为Rbac在ThinkPHP中应用的实例,用到了ThinkPHP的Rbac扩展,样式比较难看,大家将就的看。此例子旨在学习交流使用,勿用于实际项目中。 Rbac简单说来就是基于“角色”的权限控制,所有用户...

王昊然
2012/10/16
6.6K
8
后台快速开发框架 - Layui-Admin

layui-admin 【thinkphp 6.0】基于 thinkphp 的后台快速开发框架。快速构建完善的管理后台,内置表单、表格的 php 生成,以及完善的 RBAC 权限管理。 特性 基于 tp6.0 基于 layui 前端框架 ...

Thans
今天
192
0
ThinkPHP中RBAC的权限控制之配置文件2

本文摘自《草根》杂志第四期 上期我们讲解完了配置文件,基准文件,还有各个功能模块。这一期咱们完成thinkphpRBAC的最后一部份,写完基准类,并实现登陆以及权限的验证功能。 咱们先来说一下...

张沫
2010/10/15
3.5K
1
新手指导Thinkphp开发指南

小编于昨日参加朋友婚礼,浑身喜气洋洋。今天给用户带来的是关于thinkphp开发指南的纯技术性的文档,本文档目的很简单: 1、 帮助开发人员掌握thinkphp入门 2、 快速利用thinkphp进行项目开发...

汤圆
2012/12/25
325
1
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解

1当THINKPHP的父类有构造函数而子类没有时,THINKPHP不会去执行子类的_initialize();2当THINKPHP的父类子类均有构造函数时,要调用父类的构造函数必须使用parent::construct()------------...

15834278076
03/14
64
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
27分钟前
3
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
44分钟前
89
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
54分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
56分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部