源码解析
1.用户组明细表group_id字段类型mediumint(8),显然是整型,不支持字符串类型
-- ----------------------------
-- 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;2.下面是Auth类的一个方法,取出用户权限规则也是不支持一个用户属于多个用户组public function getGroups($uid) {
static $groups = array();
if (isset($groups[$uid])) return $groups[$uid];
$user_groups = M()->table($this->_config['AUTH_GROUP_ACCESS'] . ' a')->where("a.uid='$uid' and g.status='1'")->join($this->_config['AUTH_GROUP'] . " g on a.group_id=g.id")->field('uid,group_id,title,rules')->select();
$groups[$uid] = $user_groups ? : array();
return $groups[$uid];
}临时解决办法1.在Auth中自定义一个方法,获取用户所在用户组所有规则
/**
* 根据用户id获取当前用户所在用户组所有规则
* @param uid int 用户id
* @return array 用户所属的用户组的所有规则
* array(array('rules'=>'1,2,3....'))
*/
protected function getRule($uid) {
static $rules='';
$group_id = M()->table($this->_config['AUTH_GROUP_ACCESS'])->where('uid=' . $uid)->getField('group_id');
$group_id = stripos($group_id, ',') ? explode(',', $group_id) : array($group_id);
foreach ($group_id as $val) {
$data['id'] = $val;
$data['status'] = 1;
$rules.= M()->table($this->_config['AUTH_GROUP'])->where($data)->getField('rules') . ',';
}
$rules_arr[]['rules'] = $rules;
return $rules_arr ? : array();
}2.在getAuthList()方法中调用,大约在166行$groups = $this->getGroups($uid);//源码
$groups = $this->getRule($uid); //修改为这个
//在$ids = array_unique($ids);后面(大约在172行)加
sort($ids);3.Common/Controller/AuthController中判断是否超级管理员foreach(session('auth.title') as $v){
if ($v=='超级管理员') return true;
}4.用户组明细表group_id字段类型改为char(10)5.主页要显示用户身份,登陆时做处理
最后希望4.0能支持数组形式的用户组
最佳答案