thinkphp 3.2 auth 源代码说明

2017-01-13 10:51:07来源:oschina作者:金于虎人点击



>胡扯: 在php中类和函数逗可以实现同一个功能,两者都是对代码的封装和复用,但类封装的更规范一点。##1. 默认配置6个 ( protected $_config=array() )
```php
//默认配置
protected $_config = array(
'AUTH_ON'=> true,// 认证开关
'AUTH_TYPE'=> 1,// 认证方式,1为实时认证;2为登录认证。
'AUTH_GROUP' => 'auth_group', // 用户组数据表名
'AUTH_GROUP_ACCESS' => 'auth_group_access', // 用户-用户组关系表
'AUTH_RULE'=> 'auth_rule',// 权限规则表
'AUTH_USER'=> 'member'// 用户信息表
);
```
>默认值,也就是我们在不传参数的时候使用的只,如果我们不想改变默认值,那么我们在设计数据库的时候就必须设表的名称如下:
```
用户表名称: member
权限规则表: auth_rule
用户和角色中间表: auth_group_access
用户组表: auth_group
```
但通常而言我们都会设置自己的表名,去覆盖默认值```
AUTH_ON一个开关,不验证的时候直接关闭,默认验证
AUTH_TYPE// 认证方式,1为实时认证;2为登录认证。 (实现方式,要不要时时读取数据库)
```##2. 构造方法(function __construct())
```php
public function __construct() {
$prefix = C('DB_PREFIX');
$this->_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'));
}
}
```
构造方法做了什么:>覆盖默认配置项,使用用户的自定义配置项,配置项的简明是固定的
>默认的数组+用户自定义数组需要合并起来,用户自定义的覆盖默认的..
优先级就是这样实现的##3. 获取权限列表
```
/**
* 获得权限列表
* @param integer $uid用户id
* @param integer $type
*/
protected function getAuthList($uid,$type) {
static $_authList = array(); //保存用户验证通过的权限列表
$t = implode(',',(array)$type);
if (isset($_authList[$uid.$t])) {
return $_authList[$uid.$t];
}
if( $this->_config['AUTH_TYPE']==2 && isset($_SESSION['_AUTH_LIST_'.$uid.$t])){
return $_SESSION['_AUTH_LIST_'.$uid.$t];
}
//读取用户所属用户组
$groups = $this->getGroups($uid);
$ids = array();//保存用户所属用户组设置的所有权限规则id
foreach ($groups as $g) {
$ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
}
$ids = array_unique($ids);
if (empty($ids)) {
$_authList[$uid.$t] = array();
return array();
}
$map=array(
'id'=>array('in',$ids),
'type'=>$type,
'status'=>1,
);
//读取用户组所有权限规则
$rules = M()->table($this->_config['AUTH_RULE'])->where($map)->field('condition,name')->select();
//循环规则,判断结果。
$authList = array(); //
foreach ($rules as $rule) {
if (!empty($rule['condition'])) { //根据condition进行验证
$user = $this->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']);
}
}
$_authList[$uid.$t] = $authList;
if($this->_config['AUTH_TYPE']==2){
//规则列表结果保存到session
$_SESSION['_AUTH_LIST_'.$uid.$t]=$authList;
}
return array_unique($authList);
}
```

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台