PS:最近需要做一个验证用户权限的功能,在官方和百度看了下,发现大家都是用auth来做验证,官方有很多auth的使用教程,但是都不全面,我也提问了几个关于auth的问题 也没人来回答我,无奈只好一步步看代码研究了。本人基础不好,属于半路出家的那种,希望我的教程大家不要见笑。 新手纯属无奈之举。。。
废话不多开始解密:

首先说下我使用的Thinkphp版本:ThinkPHP3.2.3完整版
auth 翻译成中文就是认证的意思。
TP的auth类 核心版 是没有的。完整版才有,这点大家要注意下!
1:首先打开Auth.class.php 
文件位置 Thinkphp/Library/Think/Auth.class.php
2:打开Auth类文件之后我们要建Auth认证所需要的3张表了,Auth类中已经给了表所用的字段了 直接复制回来粘贴到 phpmyadmin中运行sql就可以;
Auth所用的张表如下:

  1. //数据库
  2. /*
  3. -- ----------------------------
  4. -- think_auth_rule,规则表,
  5. -- id:主键,name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用,condition:规则表达式,为空表示存在就验证,不为空表示按照条件验证
  6. -- ----------------------------
  7. DROP TABLE IF EXISTS `think_auth_rule`;
  8. CREATE TABLE `think_auth_rule` (
  9. `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  10. `name` char(80) NOT NULL DEFAULT '',
  11. `title` char(20) NOT NULL DEFAULT '',
  12. `type` tinyint(1) NOT NULL DEFAULT '1',
  13. `status` tinyint(1) NOT NULL DEFAULT '1',
  14. `condition` char(100) NOT NULL DEFAULT '',  # 规则附件条件,满足附加条件的规则,才认为是有效的规则
  15. PRIMARY KEY (`id`),
  16. UNIQUE KEY `name` (`name`)
  17. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  18. -- ----------------------------
  19. -- think_auth_group 用户组表,
  20. -- id:主键, title:用户组中文名称, rules:用户组拥有的规则id, 多个规则","隔开,status 状态:为1正常,为0禁用
  21. -- ----------------------------
  22. DROP TABLE IF EXISTS `think_auth_group`;
  23. CREATE TABLE `think_auth_group` (
  24. `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  25. `title` char(100) NOT NULL DEFAULT '',
  26. `status` tinyint(1) NOT NULL DEFAULT '1',
  27. `rules` char(80) NOT NULL DEFAULT '',
  28. PRIMARY KEY (`id`)
  29. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  30. -- ----------------------------
  31. -- think_auth_group_access 用户组明细表
  32. -- uid:用户id,group_id:用户组id
  33. -- ----------------------------
  34. DROP TABLE IF EXISTS `think_auth_group_access`;
  35. CREATE TABLE `think_auth_group_access` (
  36. `uid` mediumint(8) unsigned NOT NULL,
  37. `group_id` mediumint(8) unsigned NOT NULL,
  38. UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
  39. KEY `uid` (`uid`),
  40. KEY `group_id` (`group_id`)
  41. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  42. */
复制代码

PS:大家自行改成自己所需的表前缀即可; 
另外要说的一点是:这3张表 大家可以可以改表名,只要字段包含Auth所需的认证字段也可以。如果你把这3张表改名了,只要在Auth的配置项中改成自己对应的表名即可。

3:3张表建好 先讲下这3张表的作用 (本人理解有限 大家勿喷)
(我的表前缀为tp_)
tp_auth_rule(rule翻译成中文为【规则】 合起来就是认证规则)
字段概述:
id:这个不必多说 相信大家都懂得 (表主键,自增 ,规则ID标识)
name:认证规则 (字段保存的是你需要认证的 【模块名/控制器名/方法名】或【自定义规则】 字符串类型 这里大家最好按照 模块名/控制器/方法 来填写,多个规则之间用,隔开即可,当前规则是按照你的思路来定制的,你也可以填写一个 admin 或 * 或 guanliyuan 等!字段长度为80,不要超过这个长度就可以)
title:规则描述 这个不多讲
type:tinyint类型的,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。(默认为1)
condition:当type为1时,condition字段里面的内容将会用作正则表达式的规则来配合认证规则来认证用户
tp_auth_group(group翻译为中文为 【组】的意思,合起来就是认证组)
字段概述:
id:这个大家都懂得吧(认证组的ID标识,表主键 自增)
title:认证组名称
status:是否开启 0为关闭 1为开启 (默认为1 开启)
rules :规则ID (这里填写的是 tp_auth_rule里面的规则的ID,下面会给大家演示)
tp_auth_group_access(这个表就俩字段,是规则和组别的中间表)
字段概述:
uid:会员ID (这里填写是 需要认证的会员ID)
group_id:认证组ID (这里填写的是 认证组的ID)

Ps:这里跟大家说下我是怎么理解这3张表的关系的:
实际上使用Auth是需要4张表的(1.会员表 2.认证规则表 3.认证组表 4.认证中间表),我表达能力不强,简单的说下:

a.我在 tp_auth_rule里面添加一个或多个验证规则用来验证你的访问权限 
例如:
(Admin/Article/Add)增加文章的权限
(Admin/Article/Edit)修改文章的权限
(Admin/Article/Delete)删除文章的权限
Ps:这3个规则可以合并成一个规则,合并成一个规则的话就是: (Admin/Article/Add,Admin/Article/Edit,Admin/Article/Delete)!
还有一点:这个规则是80个字节,大家不要超过了; 这个规则你也可以写成 Article (意思就是拥有所有操作文章的权限)
也可以写成(Article-Add-Edit-Delete)这样的 意思是拥有文章的增删改权限
还可以写成(Article-Add-Edit)扎样的 意思是 拥有文章的增加和修改的权限,没有删除权限
总之这里的规则你可以按照自己的思路来,很灵活的。这点超级赞!
//为了更多的小白明白我在啰嗦啰嗦:
例如:
Home/List/Php 拥有访问前台Php栏目的权限
Home/List/HTML 拥有访问前台HTML栏目的权限
Home/List/PHP,Home/List/HTML 拥有访问前台 PHP 和 HTML 栏目的权限
LIST-PHP-HTML 拥有访问前台PHP 和 HTML 栏目的权限
总之规则大家自定义 很灵活,只要在你需要认证的地方灵活的运用Auth验证就可以的!

b.在认证组中 添加2个用户组(分别是:信息录入部门、信息审核部门,信息XX部门) 
status 默认为就行,默认为1 就是开启这个认证组
rules 规则ID多个规则用,隔开 例如我现在有4条规则分别是:
id为1: Admin/Article/Add 增加文章的权限
id为2: Admin/Article/Edit 修改文章的权限
id为3: Admin/Article/Delete 删除文章的权限
id为4: Article-Add-Edit-Delete 拥有文章的增删改权限
分析下:信息录入部 需要的是 文章的 增加和修改还有删除权限,审核部门需要的是 修改和删除的权限 ,信息xx部门需要所有操作信息的权限
根据分析 :
信息录入部门的 rules需要的规则为: 1,2,3
信息审核部门需要的是:2,3
信息XX部门需要的是 4
好了,插入数据:
信息录入部: title:信息录入部 rules:1,2,3 (插入之后假设ID为1)
信息审核部: title:信息审核部 rules: 2,3 (插入之后建设ID为2)
信息XX部 : title:信息XX部 rules:4 (插入之后建设ID为3)
c.认证中间表中录入需要认证的会员ID和认证组ID即可
ps:假设我现在有会员表为tp_user
里面有4个会员分别是:
id为1的: 小红
id为2的: 小明
id为3的: 小张
id为4的: 小李

下面分配权限:
小红和小明是信息录入部门的:
那么tp_auth_access如下:
uid为 1 的小红 所属认证部为 1(1也就是认证组表中的信息录入部门,拥有增加、修改、删除的权限)
uid为 2 的小明 同小红一个级别(功能一样)
uid为 3 的小张 所属认证部为 2 (2也就是认证组表中的信息审核部,拥有修改、删除的权限)
uid为 4 的小李 所属认证部为 3 (3也就是认证表中的信息XX部 拥有信息的 增加、修改、删除的权限)
PS:可能我说的有点绕,但是意思差不多就这样 嘿嘿! rule表中为所有需要认证的规则条件,group表为部门组,部门的权限为规则表中的规则id,access表为记录用户属于那个部门的! 这样理解了么?

4:现在开始认证权限吧:

Ps:这里我要纠正一点:我现在用的Thinkphp版本为ThinkPHP3.2.3完整版:在Auth类中有这么一段话:
/**
* 权限认证类
* 功能特性:
* 1,是对规则进行认证,不是对节点进行认证。用户可以把节点当作规则名称实现对节点进行认证。
* $auth=new Auth(); $auth->check('规则名称','用户id')
* 2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)
* $auth=new Auth(); $auth->check('规则1,规则2','用户id','and') 
* 第三个参数为and时表示,用户需要同时具有规则1和规则2的权限。 当第三个参数为or时,表示用户值需要具备其中一个条件即可。默认为or
* 3,一个用户可以属于多个用户组(think_auth_group_access表 定义了用户所属用户组)。我们需要设置每个用户组拥有哪些规则(think_auth_group 定义了用户组权限)

* 4,支持规则表达式。
* 在think_auth_rule 表中定义一条规则时,如果type为1, condition字段就可以定义规则表达式。 如定义{score}>5 and {score}<100 表示用户的分数在5-100之间时这条规则才会通过。
*/

有问题的是这一句:
2,可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)
$auth=new Auth(); $auth->check('规则1,规则2','用户id','and');
问题:
Auth类中的check方法一共有 5 个参数
public function check($name, $uid, $type=1, $mode='url', $relation='or')
所以官方类中的 第三个参数填写and视距上是不起任何作用的!
不知道是不是这样 哈!。。。。

Ps:在使用auth之前,要先配置下auth所用的配置项:
如果你没修改auth_rule,auth_group,auth_group_access表名称的话,只要配置你的会员表即可。在配置项中增加以下配置项:

  1. //Auth配置
  2. 'AUTH_CONFIG' => array(
  3. // 用户组数据表名
  4. //'AUTH_GROUP' => 'tp_group',
  5. // 用户-用户组关系表
  6. //'AUTH_GROUP_ACCESS' => 'tp_group_access',
  7. // 权限规则表
  8. //'AUTH_RULE' => 'tp_rule',
  9. // 用户信息表
  10. 'AUTH_USER' => 'tp_admin'
  11. ),
复制代码

还要补充一点,会员表中会员ID必须为主键!

我现在在Home/Login/Index下做实验:
先声明Auth类:

  1. <?php
  2. namespace Home\Controller;
  3. class LoginController extends \Think\Controller{
  4. public function IndexAction(){
  5. //声明Auth认证类
  6. $auth = new \Think\Auth();
  7. /*
  8. 验证单个条件
  9. 验证 会员id 为 1 的 小红是否有 增加信息的权限
  10. check方法中的参数解释:
  11. 参数1:Admin/Article/Add 假设我现在请求 Admin模块下Article控制器的Add方法
  12. 参数2: 1 为当前请求的会员ID
  13. */
  14. var_dump( $auth->check( 'Admin/Article/Add', 1 ) ); // boolean true
  15. /*
  16. 同时验证多个条件
  17. 验证 会员id 为 1 的小红是否有增加信息,修改信息 和一个不存在的规则 的权限
  18. 参数解释:
  19. 参数1:多条规则同时验证 , 验证是否拥有增加、修改、删除的权限
  20. 参数2:当前请求的会员ID
  21. ps :XXX是一个不存在的规则为什么会返回真呢? 因为check方法 第5个参数默认为 or 也就是说 多个规则中只要满足一个条件即为真
  22. */
  23. //var_dump( $auth->check( 'Admin/Article/Add,Admin/Article/Edit,Admnin/Article/Xxx', 1 ) ); //  boolean true
  24. /*
  25. 同时验证多个条件 并且 都为真
  26. 验证 会员id 为 1 的小红是否具有 增加 修改 删除 的权限
  27. 参数解释
  28. 参数1:多条规则同时验证 ,验证是否拥有 增加 修改 删除的权限
  29. 参数2:当前请求的会员ID
  30. 参数3:是否用正则验证condition中的内容
  31. 参数4:
  32. 参数5:必须满足全部规则才通过
  33. */
  34. //var_dump( $auth->check( 'Admin/Article/Add,Admin/Article/Edit,Admin/Article/Xxx', 1, 1, '', 'and' ) );        //boolean false
  35. }
  36. }
  37. ?>
复制代码

Ps:上面的例子是最基本的认证,当然朋友们可以自己定义自己的验证规则

下面说一下其他例子:

rule规则表中的name可以写 *** 或者 admin 或其他字符来代替一个通用验证规则;

在验证的时候可以用 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 来自动获取当前的 模块名称/控制器名称/方法名称例如:
$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME, 1 ) );

/*
还有一些我没了解的使用方法:
例如:

*/

  1. if ($mode=='url' && $query!=$auth ) {
  2. parse_str($query,$param); //解析规则中的param
  3. $intersect = array_intersect_assoc($REQUEST,$param);
  4. $auth = preg_replace('/\?.*$/U','',$auth);
  5. if ( in_array($auth,$name) && $intersect==$param ) {  //如果节点相符且url参数满足
  6. $list[] = $auth ;
  7. }
  8. }
复制代码

这里的$query!=$anth 不知道怎么用这个,我本地测试的时候在rule规则中增加了一个规则是 test?aa=1&bb=2
在使用auth的时候这样用可以通过认证:

url中get或者POST必须有这个aa=1&bb=2才会验证成功,很迷糊这里到底是怎么个情况,有了解的大神希望告知下
$auth->check( 'test' , 1 );

*难道这个 query!=auth 是为了不支持pathinfo的 ?module=home&controller=user&action=login 验证这样的?搞不懂。。。*

Ps:你可以写一个公共方法,把auth认证写到方法里面 方便调用!

tp auth 转载保存的更多相关文章

  1. 一篇关于Redis的很不错的文章,转载保存下

    绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...

  2. 关于JDBC和连接池我学到的(转载保存)

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  3. 过 DNF TP 驱动保护(二)

    过 DNF TP 驱动保护(二)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...

  4. C# 填充Excel图表、图例背景色

    填充背景色,一般可以选择多种不同样式来填充背景,包括填充为纯色背景.渐变背景.图片背景或者纹理背景等.下面的内容将分别介绍通过C#来设置Excel中图表背景色.以及图表中的图例背景色的方法. 使用工具 ...

  5. mongodb创建用户和密码

    创建数据库文件夹与日志文件mkdir /home/mongodb/datamkdir /home/mongodb/logstouch(创建文件)3. 启动mongodbcd到mongodb目录下的bi ...

  6. linux下javaEE系统安装部署

    最近公司在将服务器往阿里云上面迁移,所以需要重新在linux上面安装相关的软件以及部署项目,这里用到的linux版本为centos7.0,需要安装的软件有 jdk1.7.mysql5.6.mongo3 ...

  7. Monitorix 监控 安装配置

    Monitorix 监控 安装配置 1. 首先安装RPMforge RPMforge 是由 Dag 及其他包裝者合作維護的.他們為 CentOS 提供超過 5000 個套件,包括 wine.vlc.m ...

  8. C# 调用程序集方法

    加载程序集 (Assembly类) 使用 Assembly 类可以加载程序集.浏览程序集的元数据和构成部分.发现程序集中包含的类型以及创建这些类型的实例 // 加载该路径的程序集 Assembly a ...

  9. 把EXE可执行文件等作为资源包含在Delphi编译文件中

    摘自我自己过去写的一段心得. 1.编辑资源文件 *.RCWave: 资源文件是声音文件:RCDATA: 二进制数据AVI: AVI动画:ICON: 图标文件:BITMAP: 位图文件:CURSOR: ...

随机推荐

  1. 【Windows phone 8】欢迎引导页面02

    [目标]前一篇文章已经实现了图片的切换,这里需要限制pivot的循环滚动. [思路]通过手势事件,对第一张,最后一张图片处加以限制 [前台] 在pivot处加上 <toolkit:Gesture ...

  2. [QoS]cisco3560限速配置案例-收集于网工泡泡

    网络中常用到这些:CISCO和H3C-MAC过滤+端口限速+端口镜像+端口隔离 不同的方式不同的思想:嘎嘎 其他各个厂商的限速链接:http://pan.baidu.com/s/1hrIMoSG 密码 ...

  3. Java实验四 TCP客户端和服务器的应用

    实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B ...

  4. 使用iScroll实现上拉或者下拉刷新

    上拉或者下拉刷新的需求在移动端是非常常见的需求,大部分情况下,实现这个效果都使用网上现有的解决方案,例如有人使用swiper这个插件, 也有人使用iScroll这个滚动插件.本文的示例是利用iscro ...

  5. 魅蓝Note2 在Android Studio 与 Eclipse中无法被检测到

    昨天到手的Note2 结果发现测试不了,一看魅蓝的版本是android 5.1,然后更新的自己的SDK. 最后…… 仍然不能识别到手机. ———————————— 今天在stackoverflow上搜 ...

  6. WPF开发时光之痕日记本——终于完工了。。晒晒截图(三)(已上传安装包)

    由于是业余时间学习的 WPF 的相关开发且不怎么会使用 Blend 软件,所以开发这个客户端着实花费了我很长时间,比如文本编辑器的开发,最初是在 Simple.HtmlEditor 的基础上做的修改, ...

  7. Android应用程序模拟手机按键

    记得以前在做一个C++项目时,需要在某一步操作之后人为用代码模拟敲键盘上的回车键(Enter)效果. 出于好奇,这几天研究了一下Android中手机(或平板)上各种按键的键值.模拟方法及最终效果. 1 ...

  8. WebGame开发总结

    不知不觉我们的项目开发有2年了,这两年来走了很多弯路,也收获了很多,今天在这里做一个总结. 项目基本情况: 服务器端采用c++和c#混合开发,网络层采用c++开发,业务逻辑用c#开发.客户端采用sil ...

  9. SpringMVC实现Restful风格的WebService

    1.环境 JDK7 MyEclipse2014 tomcat8 maven 3.3.3 spring4.1.4 2.创建maven工程 使用MyEclipse创建maven工程的方式可以参考这篇博文( ...

  10. 每天一个linux命令(26):du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...