ThinkPHP权限认证Auth实例详解
本文以实例代码的形式深入剖析了ThinkPHP权限认证Auth的实现原理与方法,具体步骤如下: mysql数据库部分sql代码: -- Records of think_auth_group INSERT INTO -- Table structure for think_auth_group_access DROP TABLE IF EXISTS -- Records of think_auth_group_access INSERT INTO -- Table structure for think_auth_rule DROP TABLE IF EXISTS -- Records of think_auth_rule INSERT INTO DROP TABLE IF EXISTS -- Records of think_user INSERT INTO 配置文件ApplicationCommonConfconfig.php部分: return array(
//'配置项'=>'配置值' 'DB_DSN' => '',// 数据库连接DSN 用于PDO方式 'DB_TYPE' => 'mysql',// 数据库类型 'DB_HOST' => 'localhost',// 服务器地址 'DB_NAME' => 'thinkphp',// 数据库名 'DB_USER' => 'root',// 用户名 'DB_PWD' => 'root',// 密码 'DB_PORT' => 3306,// 端口 'DBPREFIX' => 'think',// 数据库表前缀 'AUTH_CONFIG' => array( 项目Home控制器部分ApplicationHomeControllerIndexController.class.php代码: check($name,$uid,$type,$mode,$relation)) {
die('认证:成功');
} else {
die('认证:失败');
}
}
}
以上这些代码就是最基本的验证代码示例。 下面是源码阅读: 1、权限检验类初始化配置信息: 创建一个对象时程序会合并配置信息 程序会合并ApplicationCommonConfconfig.php中的AUTH_CONFIG数组 _config['AUTH_GROUP'] = $prefix . $this->_config['AUTH_GROUP'];
$this->_config['AUTH_RULE'] = $prefix . $this->_config['AUTH_RULE'];
$this->_config['AUTH_USER'] = $prefix . $this->_config['AUTH_USER'];
$this->_config['AUTH_GROUP_ACCESS'] = $prefix . $this->_config['AUTH_GROUP_ACCESS'];
if (C('AUTH_CONFIG')) {
//可设置配置项 AUTH_CONFIG,此配置项为数组。
$this->_config = array_merge($this->_config,C('AUTH_CONFIG'));
}
}
2、检查权限: 大体分析一下这个方法 首先判断是否关闭权限校验 如果配置信息AUTH_ON=>false 则不会进行权限验证 否则继续验证权限 _config['AUTH_ON']) {
return true;
}
获取权限列表之后会详细介绍: getAuthList($uid,$type);
此次需要验证的规则列表转换成数组: 所以$name参数是不区分大小写的,最终都会转换成小写 开启url模式时全部转换为小写: 权限校验核心代码段之一,即循环所有该用户权限 判断 当前需要验证的权限 是否 在用户授权列表中: in_array($auth,$name) 如果 权限列表中 其中一条权限 等于 当前需要校验的权限 则加入到$list中 注: if ($relation == 'or' and !empty($list)) {
return true; } $diff = array_diff($name,$list); $relation == 'or' and !empty($list); //当or时 只要有一条是通过的 则 权限为真 3、获取权限列表: getAuthList($uid,$type); //获取用户需要验证的所有有效规则列表
这个主要流程: 获取用户组 getGroups($uid);
//SELECT `rules` FROM think_auth_group_access a INNER JOIN think_auth_group g on a.group_id=g.id WHERE ( a.uid='1' and g.status='1' )
简化操作就是: 取得用户组rules规则字段 这个字段中保存的是think_auth_rule规则表的id用,分割 $ids就是$groups变量最终转换成的 id数组: array('in',$ids),'type' => $type,'status' => 1,);
取得think_auth_rule表中的规则信息,之后循环: getUserInfo($uid); //获取用户信息,一维数组
$command = preg_replace('/{(w*?)}/','$user['1']',$rule['condition']);
//dump($command);//debug
@(eval('$condition=(' . $command . ');'));
if ($condition) {
$authList[] = strtolower($rule['name']);
}
} else {
//只要存在就记录
$authList[] = strtolower($rule['name']);
}
}
if (!empty($rule['condition'])) { //根据condition进行验证
这里就可以明白getUserInfo 会去获取配置文件AUTH_USER对应表名 去查找用户信息 重点是: '/{(w*?)}/ 可以看成要匹配的文字为 {字符串} 那么 {字符串} 会替换成$user['字符串'] $command =$user['字符串'] 如果 5';
$command =$user['age'] > 10
@(eval('$condition=(' . $command . ');'));
即: 10);
这时再看下面代码 如果为真则加为授权列表 更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《》。 希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |