OneThink中的设置权限的Auth方法

w342718192 2015-09-01 02:22:44
class AuthRuleModel extends Model{

const RULE_URL = 1;
const RULE_MAIN = 2;

}

下面这个是设置权限的方法,不知道它的第二个参数是干嘛的
final protected function checkRule($rule, $type = AuthRuleModel::RULE_URL, $mode = 'url')
{
if (IS_ROOT) {
return true;//管理员允许访问任何页面
}
static $Auth = null;
if (!$Auth) {
$Auth = new \Think\Auth();
}
if (!$Auth->check($rule, UID, $type, $mode)) {
return false;
}
return true;
}

class Auth{
public function check($name, $uid, $type=1, $mode='url', $relation='or') {
if (!$this->_config['AUTH_ON'])
return true;
$authList = $this->getAuthList($uid,$type); //获取用户需要验证的所有有效规则列表
if (is_string($name)) {
$name = strtolower($name);
if (strpos($name, ',') !== false) {
$name = explode(',', $name);
} else {
$name = array($name);
}
}
$list = array(); //保存验证通过的规则名
if ($mode=='url') {
$REQUEST = unserialize( strtolower(serialize($_REQUEST)) );
}
foreach ( $authList as $auth ) {
$query = preg_replace('/^.+\?/U','',$auth);
if ($mode=='url' && $query!=$auth ) {
parse_str($query,$param); //解析规则中的param
$intersect = array_intersect_assoc($REQUEST,$param);
$auth = preg_replace('/\?.*$/U','',$auth);
if ( in_array($auth,$name) && $intersect==$param ) { //如果节点相符且url参数满足
$list[] = $auth ;
}
}else if (in_array($auth , $name)){
$list[] = $auth ;
}
}
if ($relation == 'or' and !empty($list)) {
return true;
}
$diff = array_diff($name, $list);
if ($relation == 'and' and empty($diff)) {
return true;
}
return false;
}
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);
}

求大神指教!
...全文
839 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
w342718192 2015-12-02
  • 打赏
  • 举报
回复
。。。。。。
xuzuning 2015-10-08
  • 打赏
  • 举报
回复
没有上级,哪来的下级?
w342718192 2015-10-08
  • 打赏
  • 举报
回复
引用 3 楼 ihefe 的回复:
导航类型,1 是子菜单,2是顶部导航
多谢!我照这条线索查看代码 发现在验证顶部导航时 验证的是RULE_MAIN = 2; 在验证子菜单时验证的是RULE_URL = 1; 但是为什么要做这个区分? 我的理解是在后台设置勾选权限节点时 未勾选顶部导航分类,而勾选了该分类下面的子菜单后 在前台访问应该会显示该分类及其下面勾选了的子菜单 但是实际上只要不勾选顶部导航分类 就算勾选了其下面的子菜单 也不会在前台显示 是我理解的有错还是我用的这个系统程序有问题?
xuzuning 2015-10-08
  • 打赏
  • 举报
回复
不是分开验证,而是分开说明是否验证 验证只发生于某几个子项(不是全部)时,应该如何表示 在某个情况下需要验证的子项,在另一个场合中不需要验证,又该如何表示
w342718192 2015-10-08
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
没有上级,哪来的下级?
应该是你说的这样 但导航菜单和子菜单分开验证是出于什么考虑呢
ihefe 2015-09-30
  • 打赏
  • 举报
回复
导航类型,1 是子菜单,2是顶部导航
w342718192 2015-09-16
  • 打赏
  • 举报
回复
。。。。。。

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧