auth权限认证详细讲解
auth权限认证详细讲解
⼀、总结
⼀句话总结:四表两组关系,⼀个多对多(权限和⽤户组之间)(多对多需要3个表),⼀个⼀对多(⽤户和⽤户组之间)
1、实际上使⽤Auth是需要4张表的(1.会员表 2.认证规则表 3.认证组表 4.认证中间表),这四张表间的图像化关系是怎样的?
给⽤户组制定访问规则
会员表(⽤户表)---->⽤户组表<---->认证规则表(规则表)
认证中间表(规则⽤户组表)
2、规则表中控制规则的字段⽤什么好?
模块名/控制器名/⽅法名
【模块名/控制器名/⽅法名】或【⾃定义规则】 字符串类型 这⾥⼤家最好按照 模块名/控制器/⽅法
3、auth权限验证的表是给你写好的,验证的表的类是否给你写好了?
其实就算官⽅没有给写好,⾃⼰来写其实也是⾮常简单的
不过官⽅应该是写好的,写好的话省点事,如此⽽已
4、auth权限验证中的验证是如何实现的?
Auth类 check⽅法
在验证的时候可以⽤ MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 来⾃动获取当前的 模块名称/控制器名称/⽅法名称例如:
$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME, 1 ) );
⼆、⼀个⼩⽩对auth的理解(转)
转⾃:忘记转过来的地址了,抱歉抱歉
---恢复内容开始---
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所⽤的张表如下:
//数据库
/*
-- ----------------------------
-- think_auth_rule,规则表,
-- id:主键,name:规则唯⼀标识, title:规则中⽂名称 status 状态:为1正常,为0禁⽤,condition:规则表达式,为空表⽰存在就验证,不为空表⽰按照条件验证
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_rule`;
CREATE TABLE `think_auth_rule` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(80) NOT NULL DEFAULT '',
`title` char(20) NOT NULL DEFAULT '',
`type` tinyint(1) NOT NULL DEFAULT '1',
`status` tinyint(1) NOT NULL DEFAULT '1',
`condition` char(100) NOT NULL DEFAULT '', # 规则附件条件,满⾜附加条件的规则,才认为是有效的规则
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
整什么整什么成语
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group ⽤户组表,
-- id:主键, title:⽤户组中⽂名称, rules:⽤户组拥有的规则id,多个规则","隔开,status 状态:为1正常,为0禁⽤
-- ----------------------------
DROP TABLE IF EXISTS `think_auth_group`;
CREATE TABLE `think_auth_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`title` char(100) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1',
`rules` char(80) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- think_auth_group_access ⽤户组明细表
-- uid:⽤户id,group_id:⽤户组id
-属羊的是什么命
- ----------------------------
DROP TABLE IF EXISTS `think_auth_group_access`;
CREATE TABLE `think_auth_group_access` (
`uid` mediumint(8) unsigned NOT NULL,
`group_id` mediumint(8) unsigned NOT NULL,
UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
美国签证办理流程
KEY `uid` (`uid`),
KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
*/
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)扎样的 意思是 拥有⽂章的增加和修改的权限,没有删除权限
总之这⾥的规则你可以按照⾃⼰的思路来,很灵活的。这点超级赞!
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_ur
⾥⾯有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表名称的话,只要配置你的会员表即可。在配置项中增加以下配置项:
//Auth配置
'AUTH_CONFIG' => array(
// ⽤户组数据表名
//'AUTH_GROUP' => 'tp_group',故乡水
// ⽤户-⽤户组关系表
//'AUTH_GROUP_ACCESS' => 'tp_group_access',
// 权限规则表
//'AUTH_RULE' => 'tp_rule',
// ⽤户信息表
'AUTH_USER' => 'tp_admin'
),
还要补充⼀点,会员表中会员ID必须为主键!
我现在在Home/Login/Index下做实验:
先声明Auth类: