2017-07-11  5,750 views 发表评论

Discuz x3.3 开发公司内部账号直接登录论坛功能

 标签:    

最近公司内部有个小需求,要求内部一个系统里的账号,能直接在discuz x3.3的论坛中登录,然后正常使用discuz功能。

经过初步研究,争取最小化修改,不影响discuz的各种逻辑,决定按照下面的方式进行。

大致流程:

在api/connect目录下开发一个文件, 在当前文件中验证内部系统的账号信息,验证通过后,检查discuz的账号系统,如果有当前账号的username,则直接登录,如果没有注册当前账号并登录。

修改之前,请先正常安装discuz x3.3

修改步骤:

1. 根目录下的api.php文件, 第13行大致修改如下,新增login入口

$modarray = array(
    'js' => 'javascript/javascript',
    'ad' => 'javascript/advertisement',
    'login'=> 'connect/login'
);
if(empty($mod) || !in_array($mod, array('js', 'ad'))) {

修改成:

if(empty($mod) || !in_array($mod, array('js', 'ad', 'login'))) {

2. api/connect目录下新增login.php文件

<?php
/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 */

// http://bbs.xxx.com/api.php?mod=login&sid=&ref=
// 从自有账号体系接收sid,然后到账号系统里验证,拿到用户详细信息,
// 如果username在discuz中查找不到,则注册新的记录,如果能查询到,则直接写相关账号的登陆状态
// 打通账号体系后,discuz的账号体系停用,需要可以手动指定自有账号体系中的某个用户登录为超级管理员UID
// 也可以不用指定超级管理员账号,直接使用 http://www.xxx.com/admin.php路径登录discuz的管理后台

define("SYS_ADMIN", '');

loadcore();
require_once('./source/function/function_home.php');
require_once('./source/function/function_member.php');
// UC_API
require_once('./config/config_ucenter.php');
require_once('./uc_client/client.php');

$sid = isset($_GET['sid']) ? trim($_GET['sid']) : '';
$ref = isset($_GET['ref']) ? trim($_GET['ref']) : '';

if($sid){
    // get user info
    $uinfo = userinfo_by_sid($sid); //内部验证接口,根据自己情况实现,通过传递的sid查询得到登录用户的基本信息,来注册论坛账号
    if(!$uinfo['username']){
        showmessage("用户名不存在", $_SERVER['HTTP_REFERER']);
    }

    if($uinfo['username'] == SYS_ADMIN){
        $uinfo['username'] = 'admin';
    }

    $uid = C::t('common_member')->fetch_uid_by_username($uinfo['username']);
    if(!$uid){
        // 使用username注册一个新的bbs账号
        $uid = uc_user_register($uinfo['username'], $uinfo['password'], $uinfo['email']);
        if($uid>0){
            $groupid = 10;//默认新手上路用户组
            $group = C::t('common_usergroup')->fetch($groupid);
            $newadminid = in_array($group['radminid'], array(1, 2, 3)) ? $group['radminid'] : ($group['type'] == 'special' ? -1 : 0);
            $init_arr = explode(',', $_G['setting']['initcredits']);
            C::t('common_member')->insert($uid, $uinfo['username'], $uinfo['password'], $uinfo['email'], 'Manual Acting', $groupid, $init_arr, $newadminid);
 
            //注册成功后,更新用户统计缓存
            require_once libfile('cache/userstats', 'function');
            build_cache_userstats();
        }else{
            if($uid == -1 || $uid == -2) {
                $error = 'username_invalid';
            } elseif($uid == -4 || $uid == -5 || $uid == -6) {
                $error = 'email_invalid';
            } elseif($uid == -3) {
                $error = 'password_error';
            }
            showmessage("{$error},请联系管理员", $_SERVER['HTTP_REFERER']);
        }
    }

    // 直接登陆用户
    $member = getuserbyuid($uid);
    if($member){
        setloginstatus($member, 0);
        // 跳转至ref地址
        showmessage('登录成功, 正在跳转页面', $ref);
    }

}else {
    showmessage("登陆信息错误", $_SERVER['HTTP_REFERER']);
}

 

以上就基本上告一段落,登录discuz的管理后台关掉注册功能,即可。

给我留言

您必须 登录 才能发表留言!