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

Discuz 自动同步登陆的完美解决办法,第1张

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

Discuz非常强大,易于安装和应用,可以考虑大多数论坛的要求。所以如果使用论坛进行系统软件开发,基本都会果断选择Discuz(对比Discuz和PHPWind)。

但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('0d',$expiry?$expirytime():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=($a1)%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)){
returnsubstr($result,26);
}else{
return'';
}
}else{
return$keyc.str_replace('=','',base64_encode($result));
}
}
function_synlogin($uid){
global$dz_tablepre;
//这里必须改动一下文档的绝对路径
require_oncedirname(__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("SELECTusername,uid,password,secquesFROM".$dz_tablepre."membersWHEREuid='$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,假如必须同歩的运用许多得话必须先后改动。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/772382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存