dede与dz会员同步登录如何实现?

99ANYc3cd6
预计阅读时长 25 分钟
位置: 首页 DEDE建站 正文

核心原理

DedeCMS 和 Discuz! (DZ) 是两个独立的系统,它们各自有自己的用户数据库表,要实现同步登录,核心思想是:

dede dz会员同步登录
(图片来源网络,侵删)
  1. 识别登录来源:当一个用户在其中一个系统(DedeCMS)登录成功后,系统需要知道这个事件发生了。
  2. 获取用户信息:从当前登录系统的数据库中,获取刚刚登录的用户的关键信息(最核心的是 uidpassword)。
  3. 写入对方系统:将获取到的用户信息,以对方系统能识别的方式,写入到对方的用户数据库表中。
  4. 触发对方登录:在对方系统中,通过代码模拟一个登录过程,例如设置 Session,从而让用户在两个系统中都处于登录状态。

这个过程的关键在于密码的处理,如果两个系统的密码加密方式不同,就必须进行转换。


准备工作

在开始之前,你需要明确以下几点:

  1. 数据库信息

    • DedeCMS 的数据库名、前缀(通常是 dede_)。
    • Discuz! 的数据库名、前缀(通常是 uc_)。
    • 数据库的用户名和密码。
  2. 密码加密方式

    dede dz会员同步登录
    (图片来源网络,侵删)
    • DedeCMS: 默认使用 md5 加密,密码存储在 dede_admin (后台) 或 dede_member (前台) 表的 pwd 字段。
    • Discuz!: 默认使用 md5(md5(password) + salt) 的方式加密,密码存储在 uc_members 表的 password 字段,salt 存储在 salt 字段。
    • 这是最关键的一步! 如果密码加密方式不同,你必须在同步登录时,将 DedeCMS 的 md5 密码转换成 Discuz! 的 md5(md5(pwd) + salt) 格式。
  3. 文件位置

    • DedeCMS 的登录处理文件通常在 /member/login.php
    • Discuz! 的登录处理文件通常在 /uc_client/client.php/api/uc.php,但更常见的做法是修改其自身的登录入口。

实现步骤(以 DedeCMS 登录后同步到 Discuz! 为例)

这里我们以最常见的场景为例:用户在 DedeCMS 网站前台登录,同时自动在 Discuz! 论坛中也登录。

步骤 1:修改 DedeCMS 的登录处理文件 (/member/login.php)

  1. 找到登录成功后的代码段: 在 login.php 文件中,找到登录验证通过后,执行 ShowMsg() 跳转之前的位置,通常是在一个 if 条件语句块内。

  2. 添加同步登录代码: 在跳转之前,插入以下 PHP 代码,你需要根据你的实际情况修改数据库连接信息和 Discuz! 的配置。

// ... DedeCMS 原有的登录验证代码 ...
// 登录成功后,在这里添加同步登录代码
if ($uid > 0) {
    // 1. 获取 DedeCMS 用户信息
    $dede_db = new Dedetemplate(); // 或者你自己的数据库连接方式
    // 为了简单,这里直接使用全局的 $db 对象(如果可用)或重新连接
    // 假设你已经配置好了 DedeCMS 的数据库连接 $db_dede
    $query = "SELECT userid, pwd FROM dede_member WHERE mid = '{$uid}' LIMIT 1";
    $userRow = $db_dede->GetOne($query);
    if ($userRow) {
        $dede_userid = $userRow['userid'];
        $dede_password = $userRow['pwd']; // 这是 DedeCMS 的 md5 密码
        // 2. 连接到 Discuz! 数据库
        // --- 请根据你的配置修改以下信息 ---
        $dz_db_host = 'localhost';
        $dz_db_user = 'your_db_user';
        $dz_db_pass = 'your_db_pass';
        $dz_db_name = 'your_discuz_db';
        $dz_db_tablepre = 'uc_'; // Discuz! 数据库表前缀
        // ------------------------------------
        $link_dz = mysql_connect($dz_db_host, $dz_db_user, $dz_db_pass);
        if ($link_dz) {
            mysql_select_db($dz_db_name, $link_dz);
            mysql_query("SET NAMES 'utf8'", $link_dz);
            // 3. 检查用户是否已存在于 Discuz! 中
            $query_check = "SELECT uid, password, salt FROM {$dz_db_tablepre}members WHERE username = '{$dede_userid}' LIMIT 1";
            $dz_userRow = mysql_fetch_assoc(mysql_query($query_check, $link_dz));
            if ($dz_userRow) {
                // 用户已存在,更新密码(如果加密方式不同)
                // --- 密码转换逻辑 ---
                // Discuz! 的密码是 md5(md5(password) + salt)
                // DedeCMS 的密码是 md5(password)
                // 所以我们需要将 DedeCMS 的密码重新加密
                $new_dz_password = md5(md5($dede_password) . $dz_userRow['salt']);
                // --------------------
                $update_sql = "UPDATE {$dz_db_tablepre}members SET password = '{$new_dz_password}' WHERE uid = '{$dz_userRow['uid']}'";
                mysql_query($update_sql, $link_dz);
            } else {
                // 用户不存在,可以选择创建一个(可选,根据需求)
                // 创建用户逻辑较为复杂,需要生成随机 salt,并构造初始数据
                // 这里省略创建用户的代码,通常推荐用户先去论坛注册一次
            }
            // 4. 调用 Discuz! 的同步登录接口
            // 这个函数定义在 uc_client/client.php 中
            define('UC_CLIENT_VERSION', '1.5.0'); // 版本号
            define('UC_CLIENT_RELEASE', '20091212');
            define('UC_API', 'http://www.yourdomain.com/'); // Discuz! 根目录
            define('UC_CONNECT', 'mysql');
            define('UC_DBTABLEPRE', '`your_discuz_db`.`{$dz_db_tablepre}`'); // 注意这里要包含数据库名和表前缀
            define('UC_KEY', 'your_discuz_uc_key'); // Discuz! 的 UC_KEY,在 UCenter 设置中
            define('UC_APIID', '1'); // UCenter 中的应用 ID
            define('UC_IP', '127.0.0.1'); // 当前服务器 IP
            // 包含 Discuz! 的客户端文件
            $uc_client_path = dirname(__FILE__) . '/../../uc_client/client.php'; // 路径要写对
            if (file_exists($uc_client_path)) {
                include $uc_client_path;
                // 调用 synlogin 函数
                $syn_code = uc_user_synlogin($uid);
                // $syn_code 会返回一段 JavaScript 代码,用于在页面中执行,设置 Discuz! 的 Cookie
                // 将这段代码输出到页面
                echo $syn_code;
            }
            mysql_close($link_dz);
        }
    }
}
// ... DedeCMS 原有的 ShowMsg 跳转代码 ...
// ShowMsg('登录成功!', '-1', 2000);

代码解释

  • 首先从 DedeCMS 数据库获取当前登录用户的 useridpwd
  • 然后连接到 Discuz! 的数据库。
  • 检查该用户是否在 Discuz! 中存在,如果存在,则将 DedeCMS 的 md5 密码转换为 Discuz! 的 md5(md5(pwd)+salt) 格式并更新。
  • 最关键的一步是调用 uc_user_synlogin($uid) 函数,这个函数是 Discuz! UCenter 提供的专门用于同步登录的接口,它会生成一段 JS 代码,这段代码会设置 Discuz! 的登录 Cookie。
  • 将生成的 JS 代码 echo 到页面上,浏览器执行后,用户就在 Discuz! 中也登录了。

步骤 2:修改 Discuz! 的登录处理文件(反向同步)

如果你希望用户在 Discuz! 论坛登录后,也能在 DedeCMS 中登录,就需要执行相反的操作:

  1. 找到 Discuz! 的登录处理文件(uc_server/login.php 或其自身的登录模块)。
  2. 在登录成功后,获取登录用户的 uidpassword(注意,这里的密码已经是 Discuz! 的加密格式)。
  3. 连接到 DedeCMS 数据库。
  4. 根据 uidusername 查找 DedeCMS 的用户。
  5. 注意:由于 DedeCMS 的密码是简单的 md5,而 Discuz! 的密码是 md5(md5(pwd)+salt)不能直接将 Discuz! 的复杂密码存入 DedeCMS,这时你有两个选择:
    • 选择 A(推荐):只同步登录状态,不更新密码,即,将 DedeCMS 中该用户的密码保持原样,当用户下次在 DedeCMS 登录时,只要密码正确即可,这避免了密码混乱。
    • 选择 B:将 Discuz! 的密码进行“降级”处理,但这非常复杂且不安全,不推荐。
  6. 如果用户不存在于 DedeCMS,可以选择创建或忽略。
  7. 在 DedeCMS 中设置 Session,模拟登录,这通常需要调用 DedeCMS 的 $_SESSION['uid']$_SESSION['mtype'] 等变量。

更优的解决方案:使用 UCenter

如果你对这两个系统都有完全的控制权,最标准、最推荐的方法是使用 UCenter

UCenter 是 Discuz! 官方开发的一套用户中心系统,所有应用(DedeCMS, Discuz!, Ecshop 等)都向 UCenter 注册,用户信息统一存储在 UCenter 的数据库中。

使用 UCenter 的好处

  1. 统一管理:所有用户数据都在一个地方,无需手动同步。
  2. 自动同步:UCenter 内置了同步登录、同步注册、同步退出等功能,你只需要在 DedeCMS 中正确配置即可,无需修改核心登录文件。
  3. 安全可靠:官方方案,经过大量项目验证,稳定性和安全性都更高。
  4. 扩展性强:未来如果需要接入其他应用(如微擎、微赞等),只需向 UCenter 注册即可。

配置步骤

  1. 安装 UCenter:在你的服务器上安装 UCenter。
  2. 添加应用:在 UCenter 的管理后台,将你的 DedeCMS 网站和 Discuz! 论坛都作为“新应用”添加进去,添加时,UCenter 会生成一个通信密钥(UC_KEY)。
  3. 配置 DedeCMS:修改 DedeCMS 根目录下的 config_ucenter.php 文件,填入 UCenter 提供的相关信息(URL、数据库名、UC_KEY 等)。
  4. 配置 Discuz!:修改 Discuz! 根目录下的 config_ucenter.php 文件,同样填入 UCenter 的信息。
  5. 同步用户:安装配置完成后,通常会有一个同步用户数据的工具,将现有用户导入到 UCenter。

配置完成后,当你调用 DedeCMS 的 uc_user_synlogin() 函数时,它会自动与 UCenter 通信,UCenter 再通知所有已接入的应用(包括 Discuz!)进行同步登录,整个过程完全自动化。

方法 优点 缺点 适用场景
手动修改代码 灵活,不依赖 UCenter。 复杂,容易出错,密码处理是难点,维护成本高。 临时需求,或无法安装 UCenter 的环境。
使用 UCenter 标准、稳定、安全、自动化,一劳永逸。 需要额外安装和配置 UCenter。 所有推荐使用的场景,尤其是对系统稳定性和安全性有要求的项目。

对于大多数项目来说,强烈建议你花时间配置 UCenter,这会让你在后续的开发和维护中省去无数的麻烦,如果只是临时测试或小范围使用,可以考虑手动修改代码的方法。

-- 展开阅读全文 --
头像
dede如何判断会员是否登录?
« 上一篇 02-18
织梦二级域名如何实现?
下一篇 » 02-18

相关文章

取消
微信二维码
支付宝二维码

目录[+]