TP框架中,关于对auth权限分配的理解

来源:互联网 发布:树莓派部署python环境 编辑:程序博客网 时间:2024/06/05 09:20

最近正在和总工做一个项目,学着练着,练着不会了就抓紧学。本身基础不好,那就使劲儿啃呗。

今天的主题,一个综合性网站后台中,免不了要有管理员和普通员工。而管理员可以访问的后台页面相对于普通会员是不一样的,管理员的权限比较高,可以任意的增删改查,而普通员工只能访问固定的页面和新建文章。而这些问题可以通过ThinkPHP系统内自带的auth类来指定规则和验证此用户是否有符合规则。

auth翻译成中文也就是认证的意思。

首先ThinkPHP版本:ThinkPHP3.2.3完整版。auth类在核心板是没有的,完整版才有。

1,打开Thinkphp/library/think/auth.class.php文件,类中第一句就说明了默认配置的问题,首先需要四张表,auth_group:用户组数据表、auth_group_access:用户和用户组的关系表、auth_rule:权限规则表、user:你自己的用户表。

这些表定义好之后,将这些复制到应用级别的config.php文件中,类似于数据库类的复制。

    

2.之后我们开始创建我们的数据表:可以使用下列代码、

//数据库/*-- ------------------------------ 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; */


3,三张数据表建好之后,根据个人理解我来说一下三张数据表的结构和作用。

auth_rule表:

id:表的主键,自增,标识。

name:认证规则(格式: 模块名\控制器名\方法名)

title:对认证规则的描述

type:tinyint类型,如果type=1,则condition字段就可以定义规则表达式。

condition:当type=1时,condition字段里边的内容将会用正则表达式的规则来配合规则认证用户。


auth_group表:

id:认证组别的标识,主键自增。

title:组别名称。

status:默认1为开启,0为关闭。

rules:规则的id(也就是auth_rule表中的id)。


auth_group_access表:

uid:会员ID(这里的id其实就是你自己user表中的id,你想规定哪个id需要哪一项权限,就填进去就可以)。

group_id:认证组别的id(auth_group中分组的id)。


三张表的结构已经讲清楚了,可能看了之后还不太明白。

其实auth类的验证流程是这样的:首先获取登录时用户的session['id'] -> 判断用户处于什么分组 -> 判断此分组规则 -> 通过规则验证成功,不通过返回。


具体点就是,假如说session['id'] = 1 ,auth会将此id拿到auth_group_access表中对照这个id属于什么分组。假如说id=1属于1分组,系统会再拿着分组1到auth_group表中核对分组1属于哪一项规则id,然后再拿着这一项规则id去auth_rule表中查找规则,查找到规则之后,再与check()方法中的规则相比对,相同返回true,不同返回false。还有status和type没有说,其实就是status=0的话,则这条规则不存在。type=1时,如果condition中有正则表达式,系统会再此验证是否符合正则。


通过实例来说吧:

1,我们要将auth.class.php中的配置语句复制到分组级别的配置文件当中:

'AUTH_CONFIG'=>array(        'AUTH_ON' => true, //认证开关        'AUTH_TYPE' => 1, // 认证方式,1为时时认证;2为登录认证。        'AUTH_GROUP' => 'think_auth_group', //用户组数据表名        'AUTH_GROUP_ACCESS' => 'think_auth_group_access', //用户组明细表        'AUTH_RULE' => 'think_auth_rule', //权限规则表        'AUTH_USER' => 'sp_user'//用户信息表    ) ,


 

2,然后在分组控制器中添加

public function _initialize() {            $id = (int)session('id');            if(empty($id)) {                              $url = U('Public/login');                echo "<script>top.location.href='$url'</script>";            }            $auth = new \Think\Auth();            var_dump( $auth->check( 'Admin/Dept/showList', $id ) );            var_dump( $auth->check( 'Admin/admin/home', $id ) );            var_dump( $auth->check( 'Admin/Dept/edit', $id ) );            if( $auth->check( 'Admin/Dept/add', $id ) == true){                echo "i love likui";            }else{                echo "oh my god!";            };        }
var_dump返回true or false。同样可以用if循环判断。

可以同时对多条规则进行认证,并设置多条规则的关系(or或者and)
$auth=new Auth(); $auth->check('规则1,规则2','用户id','and');

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




原创粉丝点击