您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程

Discuz x3 UCenter实现同步登陆的方法

颜东鑫2025-07-01Discuz教程已有人查阅

导读1、Discuz x3 的登录页面URL是:/member.php?mod=logging&action=login2、这个登录页面,登录提交的地址是:在/member.php文件中,我们可以看到对应的加载的mod文件:

1、Discuzx3的登录页面URL是:/member.php?mod=logging&action=login
2、这个登录页面,登录提交的地址是:
<form method="post" autocomplete="off" name="login" id="loginform_LKsWY" class="cl" onsubmit="pwdclear = 1;ajaxpost('loginform_LKsWY', 'returnmessage_LKsWY', 'returnmessage_LKsWY', 'onerror');return false;" action="member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LKsWY" fwin="login">
在/member.php文件中,我们可以看到对应的加载的mod文件:
require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php';
在/source/module/member/member_logging文件中,我们看到下面代码:
$ctl_obj = new logging_ctl();
$ctl_obj->setting = $_G['setting'];
$method = 'on_'.$_GET['action'];
$ctl_obj->template = 'member/login';
$ctl_obj->$method();
这里的类logging_ctl来自source/class/class_member.php文件。
这个类的functionon_login()方法就是登录处理的方法。
其中on_login()方法中下面这一行就是判断DB中数据是否能匹配。也就是对username和password进行验证。
$result = userlogin($_GET['username'], $_GET['password'], $_GET['questionid'], $_GET['answer'], $this->setting['autoidselect'] ? 'auto' : $_GET['loginfield'], $_G['clientip']);
这个函数的实现在source/function/function_member.php这个文件中。
3、如果验证成功,将调用位于uc_client下client.php文件中的函数uc_user_synlogin,class_member.php中调用代码:
$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
uc_client下client.php文件中,uc_user_synlogin($uid)函数调用
$return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
uc_api_post函数的作用是将将数据通过socket发送到ucenter。
对应的代码在client.php文件中,代码如下:
function uc_api_post($module, $action, $arg = array()) {
$s = $sep = '';
foreach($arg as $k => $v) {
$k = urlencode($k);
if(is_array($v)) {
$s2 = $sep2 = '';
foreach($v as $k2 => $v2) {
$k2 = urlencode($k2);
$s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
$sep2 = '&';
}
$s .= $sep.$s2;
} else {
$s .= "$sep$k=".urlencode(uc_stripslashes($v));
}
$sep = '&';
}
$postdata = uc_api_requestdata($module, $action, $s);
return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
}
注意是向:UC_API.'/index.php'这个地址,一般是/uc_server/index.php这个文件。
4、然后这个函数后向Ucenter的index.php传递数据,index.php接受传递的数据,获得model为user,action为synlogin的值。
5、然后Ucenter的index.php调用/uc_server/control目录下的user.php类中的onsynlogin方法,/uc_server/index.php代码中如下代码:
define('UC_ROOT', dirname(__FILE__).'/');
include UC_ROOT."control/$m.php";
$method = 'on'.$a;
通过foreach循环,以javascript的方式通知uc应用列表中开启同步登陆的应用进行同步登录;即通过get方式传递给各个应用目录中api下的uc.php一些数据。
6、uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie。
7、各个应用用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过,从而让用户可以自动登陆。
应用程序的logging.php------>uc_client中的client.php------>Ucenter------>应用程序中api/uc.php
其实Ucenter实现同步登陆的原理就是cookie,一个应用登陆成功之后,向Ucenter传递数据,让Ucenter通知其他的应用也设置cookie,这样用户在访问其他应用的时候通过已经设置好的cookie实现自动登陆。了解了Ucenter的同步原理,再遇到无法同步登陆,或者开发一些与UCenter接口的时候就会容易很多。

本文标签:

很赞哦! ()

相关源码

  • (PC+WAP)生活资讯百科新闻门户类pbootcms网站模板为生活资讯、百科门户类企业打造的高性能网站模板,基于PbootCMS开源内核开发,采用HTML5响应式架构,PC与手机端实时数据同步,覆盖全终端用户浏览场景。查看源码
  • (PC+WAP)红色户外岗亭钢结构岗亭pbootcms网站模板为钢结构岗亭、户外设施企业打造的高端响应式营销门户,基于PbootCMS开源内核深度开发,采用HTML5自适应架构,实现PC与移动端数据实时同步展示。查看源码
  • (自适应)餐具英文外贸生活用品带下载功能网站模板免费下载为餐具及生活用品外贸企业打造的响应式网站模板,基于PbootCMS内核开发。突出产品展示与多语言支持特性,通过自适应设计确保更好客户在手机、平板、电脑等设备上获得一致浏览体验。查看源码
  • 帝国cms7.5手游评测资讯礼包合集游戏专区下载网站模板本模板基于帝国CMS系统开发,为手游门户网站设计。支持PC端与移动端同步生成HTML静态页面,内置多端同步生成功能。模板架构针对手业特点优化,满足APP下载、游戏资讯、攻略等内容发布需求。查看源码
  • (自适应)蓝色建材亚克力板材装饰材料pbootcms网站模板这款基于PbootCMS开发的响应式模板为建材板材行业优化设计,适用于亚克力板材、建筑装饰材料等企业展示需求。采用HTML5技术实现手机/PC跨终端适配,管理员通过统一后台即可同步查看源码
  • (自适应)中英双语配线器材扎带线卡网站pbootcms模板免费下载为线缆管理、电气配线领域打造的响应式网站模板,采用PbootCMS内核开发,可快速搭建企业级产品展示平台,数据实时同步管理。查看源码
分享笔记 (共有 篇笔记)
验证码:

本栏推荐