discuz部分修改

discuz和Java系统整合,但是麻烦的事情来了,Java系统没有username,统一使用邮箱的,但是discuz必须要用户名而且邮箱不符合用户名的规范。现在正在解决中。

注意:
以下代码都是站长自己修改,由于站长不懂PHP,只是照葫芦画瓢,所以可能存在一些问题,请谨慎使用。
另外网站使用了邮箱登录注册,所以改了很多地方的$username$email请熟知。

首先解决接口使用邮箱登录,其实有注释很简单就可以看懂的,但是最重要的一个参数$isuid注释简直无情,最后看了源码:

$this->init_input();
$isuid = $this->input('isuid');
$username = $this->input('username');
$password = $this->input('password');
$checkques = $this->input('checkques');
$questionid = $this->input('questionid');
$answer = $this->input('answer');
if($isuid == 1) {
    $user = $_ENV['user']->get_user_by_uid($username);
} elseif($isuid == 2) {
    $user = $_ENV['user']->get_user_by_email($username);
} else {
    $user = $_ENV['user']->get_user_by_username($username);
}

同步登录的时候必须要到discuz登陆一次才能激活,解决办法,修改api/uc.php

if(($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}

修改为:

if(($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
} else {
    $username = $get['username'];
    $user_uc = DB::fetch_first("select uid, username, email from ".DB::table("ucenter_members")." where email = '".$username."'");
    if($user_uc && $user_uc['uid'] > 0) {
        $init_arr = array(0, 0, 0, 0, 0, 0, 0, 0, 0);
        $groupid = $this->setting['regverify'] ? 8 : $this->setting['newusergroupid'];
        C::t('common_member')->insert($user_uc['uid'], $user_uc['username'], md5(random(10)), $user_uc['email'], $_G['clientip'], $groupid, $init_arr);
        $member = getuserbyuid($user_uc['uid'], 1);
        if($member)
            dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
    }
}

如果是登录时discuz不存在用户时,调用注册方法注册进去。

修改密码(这里吐槽一下,修改密码不是立即同步的,所以存在一些问题),同步搜索$_ENV['note']->add('updatepw',然后把所有的都修改:

$_ENV['note']->add('updatepw', 'username='.$email.'&password='.urlencode($newpw));

同步邮箱登录的地方修改,位置自己搜索一下,另外还有的加密方式不同也修改这里:

$synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['email'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&salt=".$this->user['salt']."&time=".$this->time, 'ENCODE', $app['authkey'])).'"></script>';

最后感觉ucenter这个安全存在一些问题的,如果有人知道你的appkey,那么基本上都可以登录了,登录这些都是没有判断用户的密码的,通过验证,直接用ID取出用户信息的,所以可以自己加一下密码验证。

参考文章:http://www.tuicool.com/articles/raYFVjV