我的编程空间,编程开发者的网络收藏夹
学习永远不晚
位置:首页-资讯-开源

Discuz 自动同步登陆的完美解决办法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Discuz 自动同步登陆的完美解决办法

但Discuz的同步登陆问题是个头疼的问题,网上搜搜,类似的文章、贴子无数,也参考过很多的文章,始终没能完美地解决自己系统登陆后同步登陆Discuz的问题;在开发机上正常的,放到服务器上就会出现无法同步登陆的情况。

无奈之下,自己看了一下UCenter、Discuz同步登陆的机制,提炼出了以下用于同步登陆Discuz的代码:


复制代码代码如下:

<?php

// 此处需要修改为Discuz根目录下config.php中的对应设置

$cookiepre = 'dz_'; // cookie 前缀

$cookiedomain = ''; // cookie 作用域

$cookiepath = '/'; // cookie 作用路径

$timestamp = time();

function _setcookie($var, $value, $life = 0, $prefix = 1) {

global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER;

setcookie(($prefix ? $cookiepre : '').$var, $value,

$life ? $timestamp + $life : 0, $cookiepath,

$cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);

}

function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {

$ckey_length = 4;

$key = md5($key ? $key : UC_KEY);

$keya = md5(substr($key, 0, 16));

$keyb = md5(substr($key, 16, 16));

$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

$cryptkey = $keya.md5($keya.$keyc);

$key_length = strlen($cryptkey);

$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;

$string_length = strlen($string);

$result = '';

$box = range(0, 255);

$rndkey = array();

for($i = 0; $i <= 255; $i++) {

$rndkey[$i] = ord($cryptkey[$i % $key_length]);

}

for($j = $i = 0; $i < 256; $i++) {

$j = ($j + $box[$i] + $rndkey[$i]) % 256;

$tmp = $box[$i];

$box[$i] = $box[$j];

$box[$j] = $tmp;

}

for($a = $j = $i = 0; $i < $string_length; $i++) {

$a = ($a + 1) % 256;

$j = ($j + $box[$a]) % 256;

$tmp = $box[$a];

$box[$a] = $box[$j];

$box[$j] = $tmp;

$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

}

if($operation == 'DECODE') {

if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {

return substr($result, 26);

} else {

return '';

}

} else {

return $keyc.str_replace('=', '', base64_encode($result));

}

}

function _synlogin($uid){

global $dz_tablepre;

//此处需要修改一下文件的相对路径

require_once dirname(__FILE__).'/../forum/forumdata/cache/cache_settings.php';

$uid = intval($uid);

$cookietime = 2592000;

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

$member = get_row_array_from_sql("SELECT username, uid, password, secques FROM ".$dz_tablepre."members WHERE uid='$uid'");

_setcookie('sid', '', -86400 * 365);

_setcookie('cookietime', $cookietime, 31536000);

_setcookie('auth', _authcode("$member[password]\t$member[secques]\t$member[uid]", 'ENCODE', $discuz_auth_key), $cookietime);

}

function _synlogout() {

_setcookie('auth', '', -86400 * 365);

_setcookie('sid', '', -86400 * 365);

_setcookie('loginuser', '', -86400 * 365);

_setcookie('activationauth', '', -86400 * 365);

}

将上述代码加入到自己的系统中,修改好提示需要修改的代码,在需要同步登陆的时候调用 _synlogin($uid) ,在需要同步退出的时候调用_synlogout()。特别注意的是:在调用 _synlogin($uid) 和 _synlogout() 之前不能有请求响应内容输出,否则cookie设置无效。

以上完美地解决了登陆到自己的系统后,自动登陆Discuz的问题。

那么反过来如何做呢?用户登陆了Discuz,也应该能自动登陆到自己的系统。

只需要在Discuz根目录下的include/common.inc.php末尾加上以下代码:


复制代码代码如下:

if ($discuz_uid){

session_start();

$_SESSION["uid"] = $discuz_uid;

}

在自己的系统上只要检测到$_SESSION["uid"]就视为已经登陆了。

以上,完美实现了自己系统和Discuz的双向同步登陆。此法的局限是绕过了UCenter,如果需要同步的应用很多的话需要依次修改。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Discuz 自动同步登陆的完美解决办法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Discuz 自动同步登陆的完美解决办法

但Discuz的同步登陆问题是个头疼的问题,网上搜http://www.cppcns.com搜,类似的文章、贴子无数,也参考过很多的文章,始终没能完美地解决自己系统登陆后同步登陆Discuz的问题;在开发机上正常的,放到服务器上就会出现无法
2022-06-12

Discuz、UCenter登陆管理后台自动退出的解决方法

最近趁着crazydomains免费asia域名的活动,注册了一个Groovy.asia的域名,周末无聊想搭建一个论坛,供收集整理相关学习资料分享,随手安装了曾经最熟悉的康盛Discuz,X1之后好久没有,发现已经2.5,满心欢喜的装上了,
2022-06-12

Discuz整合ECShop同步登出问题的解决方法

修改ecshop编程客栈编程客栈/www.cppcns.comapi/uc编程客栈.phphttp://www.cppcns.com
2022-06-12

XP系统登陆后自动注销的原因以及解决办法

本篇内容介绍了“XP系统登陆后自动注销的原因以及解决办法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 问题描述用户来电表示点击用户名进入桌
2023-06-14

Android实现登陆页logo随键盘收放动态伸缩(完美解决键盘弹出遮挡控件的问题)

在最近的两个项目中,项目需求要求我们实现 这样的效果,宝宝心里苦呀,本来半天搞定的事还非得折腾一下,好吧我妥协,毕竟我还是一只非常注重用户体验的猿。 那就做吧,初步
2022-06-06

编程热搜

  • wordpress错位如何解决
    这篇文章主要介绍“wordpress错位如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“wordpress错位如何解决”文章能帮助大家解决问题。wordpress
    wordpress错位如何解决
  • 帝国cms调用栏目别名的修改步骤
    请留意下面的修改方法 修改后栏目别名使用 !--bname--] 调用 打开e/class/t_functions.php搜索定位到带模板的栏目导航标签修改1复制代码代码如下://替换变量$bclassname=$class_r[$clas
    帝国cms调用栏目别名的修改步骤
  • 动易Cms MAC验证视图失败的解决方法
    “/”应用程序中的服务器错误。 -------------------------------------------------------------------------------- 验证视图状态 MAC
    动易Cms  MAC验证视图失败的解决方法
  • DEDECMS如何支持中文水印
    DEDECMS如何支持中文水印?修改/include/inc_photograph.php,在165行处加这行代码:$w_text = iconv("GB2312","UTF-8",$w_text);OK,现在可以用中文做水印了,但默认的字体大小是5,中文字体
    DEDECMS如何支持中文水印
  • 快速了解Discuz!程序文件功能
    相信有不少人热衷于基于修改原有系统文件所做的插件,当然了解程序文件功能是最重要的,下面我把Discuz! X2.0主要的程序文件功能说一下。Tips:Q:针对说明的文件是?A:我只基于原版文件对upload目录中基本的程序文件(php,ht
    快速了解Discuz!程序文件功能
  • DedeCMS编辑器fck更换成eWebEditor编辑器具体步骤
    将eWebEditor编辑器插入DEDE后台的效果: 完全Word在线编辑的功能,让你从此摆脱发可编辑器卡得死,进入流畅干净编辑界面新时代。 下面是具体步骤: 首先,你要知道eWebEditor是一个什么工具。 eWebEditor是由国
    DedeCMS编辑器fck更换成eWebEditor编辑器具体步骤
  • 允许 WordPress 上传任意文件的方法
    此时如果上传一个不在预定义编程客栈的安全扩展名列表,如.lrc,会报kAtKhHRl错: F编程客栈ile type does not meet security guidelines. Try another. 解决此问题有两方法: 在
    允许 WordPress 上传任意文件的方法
  • dedecms 软件下载模块中添加下载方式为迅雷下载联盟代码
    修改 /plus/download.php 文件 www.cppcns.com查找
    dedecms 软件下载模块中添加下载方式为迅雷下载联盟代码
  • dedecms网站tag标签全部静态化的解决方法
    更改tags.php文件在根目录 找到$tag = FilterSearch(urldecode($tag)); 替换为:$tag = urldecode($tag); 更改文件arc.taglist.class.php文件文件所在的路径是
    dedecms网站tag标签全部静态化的解决方法
  • 帝国CMS远程保存图片的方法
    本文实例讲述了帝国cms远程保存图片的方法。分享给大家供大家参考。 具体实现方法如下:复制代码代码如下:
    帝国CMS远程保存图片的方法

目录