整合游戏账号登陆论坛

Posted on 2011-04-14 12:24  蛇小狼  阅读(286)  评论(0编辑  收藏  举报
需求:
    游戏账号可以登录discuz论坛。

思路:
    时间短,没有做API接口。直接使用数据库同步的方法。
    1,用户登录游戏的时候,判断是否该账户在discuz_ucenter中,有则pass,没有则在uc_members中插入一条用户记录。
    2,用户在修改游戏账号密码的时候,同时修改discuz_ucenter中对应该账户的密码。
    3,用户在注册游戏账号的时候,同时写入discuz_ucenter中用户记录。

实现:
    一,修改settings.py中的数据库配置,增加一个discuz论坛所在的数据库,键名称为"ucenter"。
    例如:
    DATABASES = {
        'default': {
            'ENGINE': 'mysql',
            'NAME': 'ppy',
            'USER': 'root',
            'PASSWORD': '123',
            'HOST': '',
        },
        'second': {
            'ENGINE': 'mysql',
            'NAME': 'ppy',
            'USER': 'root',
            'PASSWORD': '123',
            'HOST': ''
        },
        'ucenter': {
            'ENGINE': 'mysql',
            'NAME': 'discuz',
            'USER': 'root',
            'PASSWORD': '1232',
            'HOST': ''
        }
    }
    
    二、程序代码改动
    #工具代码
    def get_client_ip(request):
    try:
        real_ip = request.META['HTTP_X_FORWARDED_FOR']
        regip = real_ip.split(",")[0]
    except:
        regip = request.META.get['REMOTE_ADDR', '']
    return regip

    def get_salt():
        samples = string.letters + string.digits
        salt = "".join(random.sample(samples, 6))
        return salt
    #其他代码
    略
    
    三、discuz可能需要的改动
    1,禁止用户注册,后台管理设置即可。
    2,修改密码错误次数,方便测试。
        打开 include 目录下的 misc.func.php,找到
        $return = (!$login ($timestamp – $login['lastupdate'] 900)) 4 max(0, 5 – $login['count']);
        这句
        
        $login['lastupdate'] 900))
        这个是时间限制,900秒,就是15分钟,你可以改成60就是1分钟,输入错误了1分钟后可以登陆。
        
        max(0, 5 – $login['count']);
        这里的5就是错误次数,如果想让他永远不提示,就改999999999999
    3,禁止用户修改密码
        修改discuz根目录文件memcp.php
        149行左右,修改为以下
        #$ucresult = uc_user_edit($discuz_user, $oldpassword, $newpassword, $emailnew, 0, $questionidnew, $answernew);
        $ucresult = -7;
        if($ucresult == -1) {
            showmessage('profile_passwd_wrong', NULL, 'HALTED');
        } elseif($ucresult == -4) {
            showmessage('profile_email_illegal');
        } elseif($ucresult == -5) {
            showmessage('profile_email_domain_illegal');
        } elseif($ucresult == -6) {
            showmessage('profile_email_duplicate');
        } elseif($ucresult == -7){
            showmessage('you can not change your password on this site.');
        }

问题总结:
    一、技术点
    Discuz SNS及BBS的密码采用非明文方式,加密算法如下(采用mysql函数方式描述): 
        md5(concat(md5(‘password’),salt))
    
    二、系统问题
    连接远程机器时候,有可能遭遇防火墙问题。
    
    三、数据库问题
    uc_members和cdb_members表结构中,username为char(15),如果用户名过长会有问题,
    可以修改username 为varchar(50)或者其他更合适的结构。