thinkphp权限控制

thinkphp3.2 auth权限

ThinkkPHP中的Auth类是权限控制类,实现权限控制,它提供给了我们三张表。

think_auth_rule表:认证规则表,

think_auth_group:权限认证组表;网站中所有的分类部门表

think_auth_group_access:记录用户属于那个部门的

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类

$auth = new \Think\Auth();

$auth->check(‘Home/Index/index‘,‘2‘)

时间: 2024-08-01 08:39:51

thinkphp权限控制的相关文章

Thinkphp权限控制类中_initialize()的调用原理

在使用权限认证的时候,我们会这样编写权限类: namespace Common\Common\Controller;use Think\Controller;use Think\Auth; class AuthController extends Controller{                protected function _initialize(){                        //获取登陆信息                        $uid = ses

ThinkPHP操作名权限控制

其实ThinkPHP已经内置了RBAC权限控制,操作也很方便,不过总是感觉平常的小站没有必要用RBAC.有的时候需求很简单,权限控制只检测到操作名上,不细分到方法名上.这样做完全没有必要用RBAC.好处:1.节省时间(有的时候老板定的交工时间是死的)2.懒人你懂的 权限的逻辑很简单,后台给每个用户添加一个字段,暂且命名为Competenct,  然后写一个给用户赋权限的多选框,类似于 每个多选框的值就是当前多选框的操作名,比如你有一个ArticleAction.class.php.那么你的val

基于thinkphp的RBAC权限控制

RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3个表就行了 user表:记录用户的信息和用户的角色 ->user_id:用户的id ->user_role_id:用户的角色信息  0,1,2分别为超级管理员,经理,员工 ->其它省略... role表:记录不同的角色信息,和他们拥有的权限 ->role_id:角色的id    1为经

php_ThinkPHP的RBAC(基于角色权限控制)详解

一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理. 在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收.角色与角色的关

auth 权限控制

一. 权限介绍所谓权限控制,大部分是在管理后台上使用.比如超级管理员登录,会得到所有操作的控制权:认证专员,只能给会员做认证操作:审核专员,只能操作内容的审核.删除.加精等操作,以此类推.那么 ThinkPHP 提供了一个内置的 Auth.class.php 类来实现权限控制,这个类提供了三个表:think_auth_rule(认证规则表).think_auth_group(用户组表).think_auth_group_access(用户和组对应关系表).当然还要结合自己创建的用户表进行对应即可

基于角色的权限控制

首先要明白的有一个表就是需要记录整个项目中控制器和方法,这样在权限检测的时候就可以检测数据库对应的角色有没有这个控制器或者方法的权限, 但是需要明白的是在开发的过程中当然需要把这种权限给取消,这样在开发过程是需要增加一个控制器或者方法就不需要验证权限,然后开发好了之后就需要 在权限表中增加该控制器和方法. 一般基于角色的权限控制,需要用到下面的几张表 1.用户表2,权限表,3.角色表,4权限角色关系表5用户角色关系表 这种方式是用户通过,用户角色关系表查询出自己的角色,然后通过权限角色关系表查出

基于原生PHP会员交叉权限控制

对于一个网站的后台管理系统,单一的超级管理员权限往往不能满足我们的需求,尤其是对于大型网站而言,这种单一的权限会引发许许多多的问题出现. 比如:一个网站编辑,平时他只是负责公司网站的公告更新,但如果网站后台没有严格的权限限制,他是不是就可以操作到客户的一些信息,这是存在很大隐患的. 如果学过ThinkPHP框架的朋友一定知道有个东西叫RBAC,今天咱不说那个,来说说在原生PHP语言中,怎么实现交叉权限控制. 好了,话不多说,老样子,直接说原理,上代码. 对于权限的交叉控制可以有很多种方法实现,这

rbac 权限控制

RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限. 需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法. 2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内; 废话不多说看下,键表语句如下 用户表: CREATE TABLE `wj_admin` ( `id` int(11) NOT NULL AUTO

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti