UCHome: 权限实现

UCHome的权限是通过用户组实现的。

UCHome的用户组分为三类:普通用户组,特殊用户组,系统用户组。普通用户组的用户根据经验值的变化自动升级或降级到另外一个普通用户组,特殊用户组和系统用户组的用户不受经验值的变化而改变用户组。普通用户组只能管理用户自己的空间,特殊用户组和系统用户组不仅能管理自己的空间,还能管理站点。

所有的用户组信息都存放在usergroup表(http://www.nextphp.com/upload/uchome2.0_datadict.html)中,栏位system表示组的类型:0代表普通用户组,-1代表系统用户组,1代表特殊用户组。

用户组的每一个具体权限对应到usergroupd表的一个栏位,例如,管理IP地址权限对应到usergroup表的manageip栏位,1代表允许,0代表禁止。

有两个特殊的权限:banvisit和manageconfig。banvist控制用户组成员允许访问或者禁止访问网站,manageconfig控制用户组成员是否拥有管理员身份,管理员身份可以管理网站的各项设置,通俗的说,就是所有以manage开始的权限。

网站的创建者也拥有所有的manage权限。创建者在config.php文件中通过$_SC[‘founder’]设置,可以有多个创建者,之间用逗号分隔。

1. 权限的使用

if (!checkperm('allowblog')) { //检查是否有发表日志的权限
  cpmessage('no_authority_management_operation');
}

if (!checkperm('manageip')) { //检查是否有管理IP设置的权限
  cpmessage('no_authority_management_operation');
}

2. checkperm()函数
checkperm()函数存在function_common.php文件中,执行具体的权限检查处理:

function checkperm($permtype) 
{
  global $_SGLOBAL, $space;

  if($permtype == 'admin') $permtype = 'manageconfig';

  $var = 'checkperm_'.$permtype;
  if(!isset($_SGLOBAL[$var])) {
    if(empty($_SGLOBAL['supe_uid'])) {
      $_SGLOBAL[$var] = '';
    } else {
      if(empty($_SGLOBAL['member'])) getmember();
      $gid = getgroupid($_SGLOBAL['member']['experience'], $_SGLOBAL['member']['groupid']);
      if(!@include_once(S_ROOT.'./data/data_usergroup_'.$gid.'.php')) {
        usergroup_cache();
        @include_once(S_ROOT.'./data/data_usergroup_'.$gid.'.php');
      }

      if($gid != $_SGLOBAL['member']['groupid']) {
        updatetable('space', array('groupid'=>$gid), array('uid'=>$_SGLOBAL['supe_uid']));
        if($_SGLOBAL['usergroup'][$gid]['magicaward']) {
          include_once(S_ROOT.'./source/inc_magicaward.php');
        }
      }
      
      $_SGLOBAL[$var] = empty($_SGLOBAL['usergroup'][$gid][$permtype])?'':$_SGLOBAL['usergroup'][$gid][$permtype];
      if(substr($permtype, 0, 6) == 'manage' && empty($_SGLOBAL[$var])) {
        $_SGLOBAL[$var] = $_SGLOBAL['usergroup'][$gid]['manageconfig'];//??????
        if(empty($_SGLOBAL[$var])) {
          $_SGLOBAL[$var] = ckfounder($_SGLOBAL['supe_uid'])?1:0;//?????
        }
      }
    }
  }
  return $_SGLOBAL[$var];
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注