Auth权限认证

浏览:1925 发布日期:2015/05/20 分类:技术分享
问题的提出:如果用户组有10个,某个用户属于其中的多个怎么办?
源码解析
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能支持数组形式的用户组
最佳答案
评论() 相关
后面还有条评论,点击查看>>