您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
discuz登录流程分析
觅波2025-07-01Discuz教程已有人查阅
导读discuz登录流程解析,最近在研究,Ucenter的同步登陆机制,就先从discuz的登录开始了处理脚本source/module/member/member_logging.php
discuz登录流程解析,最近在研究,Ucenter的同步登陆机制,就先从discuz的登录开始了
1.form表单提交member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=Lm137&inajax=1
处理脚本source/module/member/member_logging.php
2.source\class\class_member.php
on_login函数太长,只贴出其核心部分,该函数也是登录过程中的核心函数,通过userlogin(uc_client\control\user.php)进行数据分析,并对返回结果$result进行分析处理,返回结果
············
3.uc_client\client.php
函数uc_user_login通过call_user_func调用uc_client\control\user.php的onlogin函数
onlogin函数对数据进行分析,返回结果,回第2步中source\class\class_member.php的
1.form表单提交member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=Lm137&inajax=1
处理脚本source/module/member/member_logging.php
$ctl_obj = new logging_ctl();//初始化登陆对象,source\class\class_member.php=>class logging_ctl
$ctl_obj->setting = $_G['setting'];
$method = 'on_'.$_GET['action'];//$method='on_login';
$ctl_obj->template = 'member/login';
$ctl_obj->$method();//调用source\class\class_member.php=>on_login()
下面对source\class\class_member.php的on_login进行分析2.source\class\class_member.php
on_login函数太长,只贴出其核心部分,该函数也是登录过程中的核心函数,通过userlogin(uc_client\control\user.php)进行数据分析,并对返回结果$result进行分析处理,返回结果
$result['status']>0时,显示登陆成功,setloginstatus进行登录状态记录
$result = userlogin($_GET['username'],
$_GET['password'],
$_GET['questionid'],
$_GET['answer'],
$this->setting['autoidselect'] ? 'auto' : $_GET['loginfield'], $_G['clientip']);//95行左右,
userlogin为核心处理函数,来至uc_client\client.php//根据$result['status']返回值进行处理············
if($result['status'] > 0) //当$result['status']>0时,为登陆成功
setloginstatus($result['member'], $_GET['cookietime'] ? 2592000 : 0);//记录登录状态,完成登录动作
下面对uc_client\client.php的uc_user_login进行分析3.uc_client\client.php
函数uc_user_login通过call_user_func调用uc_client\control\user.php的onlogin函数
function uc_user_login($username, $password, $isuid = 0, $checkques = 0, $questionid = '', $answer = '', $ip = '') {
$isuid = intval($isuid);
$return = call_user_func(UC_API_FUNC, 'user', 'login', array('username'=>$username, 'password'=>$password, 'isuid'=>$isuid, 'checkques'=>$checkques, 'questionid'=>$questionid, 'answer'=>$answer, 'ip' => $ip));//UC_API_FUNC= uc_api_mysql,通过call_user_func回调调用uc_api_mysql,进行传参数,通过uc_api_mysql引入uc_client\control\user.php的onlogin函数
return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}
...................
function uc_api_mysql($model, $action, $args=array()) {
global $uc_controls;
if(empty($uc_controls[$model])) {
if(function_exists("mysql_connect")) {
include_once UC_ROOT.'./lib/db.class.php';
} else {
include_once UC_ROOT.'./lib/dbi.class.php';
}
include_once UC_ROOT.'./model/base.php';
include_once UC_ROOT."./control/$model.php";//引入uc_client\control\user.php
eval("\$uc_controls['$model'] = new {$model}control();");
}
if($action{0} != '_') {
$args = uc_addslashes($args, 1, TRUE);
$action = 'on'.$action;
$uc_controls[$model]->input = $args;
return $uc_controls[$model]->$action($args);//调用uc_client\control\user.php的onlogin函数传参数
} else {
return '';
}
}
4.uc_client\control\user.phponlogin函数对数据进行分析,返回结果,回第2步中source\class\class_member.php的
function onlogin() {
$this->init_input();
$isuid = $this->input('isuid');
$username = $this->input('username');
$password = $this->input('password');
$checkques = $this->input('checkques');
$questionid = $this->input('questionid');
$answer = $this->input('answer');
$ip = $this->input('ip');
$this->settings['login_failedtime'] = is_null($this->settings['login_failedtime']) ? 5 : $this->settings['login_failedtime'];
if($ip && $this->settings['login_failedtime'] && !$loginperm = $_ENV['user']->can_do_login($username, $ip)) {
$status = -4;
return array($status, '', $password, '', 0);
}
if($isuid == 1) {
$user = $_ENV['user']->get_user_by_uid($username);
} elseif($isuid == 2) {
$user = $_ENV['user']->get_user_by_email($username);
} else {
$user = $_ENV['user']->get_user_by_username($username);
}
$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
if(empty($user)) {
$status = -1;
} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
$status = -2;
} elseif($checkques && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {
$status = -3;
} else {
$status = $user['uid'];
}
if($ip && $this->settings['login_failedtime'] && $status <= 0) {
$_ENV['user']->loginfailed($username, $ip);
}
$merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;
return array($status, $user['username'], $password, $user['email'], $merge);
}
登录解析完成完成
本文标签:
很赞哦! ()
相关教程
图文教程
E8820s路由器部署Discuz论坛的方法
40包邮e8820s,mt7621a处理器,默频880mhz,这款路由器的breed里好像没有超频选项,不然超到1100 1200可以提升很大闪存和内存在7621里也算可以了
忘记UCENTER创始人密码怎么办,discuz密码找回方法
人们都是健忘的,何况每天的事情很多,有些站长更是做,赚点外快而已,而ucenter更是不常用,所以忘记密码是在正常不过的事情,如果密码忘记怎么找回呢?方法有很多种
Discuz数据库结构表说明
用户权限表 cdb_access 会员的UID编号 uid版块的ID号 fid是否允许查看贴子 allowview是否允许发贴 allowpost是否允许回复 allowreply是否允许下载附件 allowgetattach
Discuz的NT中集成Memcached分布式缓存的实现方法
之前写过一篇关于Discuz的NT缓存架构文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题。
相关源码
-
pbootcms模板(PC+WAP)微信小程序开发公司网站本模板为微信小程序开发代理、软件开发公司等企业设计,基于PbootCMS内核开发,支持PC+WAP双端响应式布局,数据实时同步,适用于多行业快速建站。查看源码 -
(自适应)重工工业机械挖掘机机推土机网站源码下载基于PbootCMS内核开发的专业级重工机械企业网站模板,适用于挖掘机、推土机等重型工业设备展示。采用响应式设计技术,确保在各类设备上均能呈现专业视觉效果,帮助企业建立数字化展示窗口。查看源码 -
(自适应响应式)绿色环保防腐木材轻钢别墅建材pbootcms模板下载本模板为环保防腐木材、轻钢别墅建材类企业设计开发,基于PbootCMS内核构建,充分考虑了建材行业的展示需求与产品特点。模板设计风格自然环保,布局清晰合理,呈现建材产品特性与专业优势,帮助访客直观了解产品特点并建立信任感。查看源码 -
(自适应)幽默笑话脑筋急转弯搞笑趣图博客pbootcms模板下载本模板基于PbootCMS系统开发,专为幽默笑话、搞笑趣图类网站设计。采用轻松活泼的布局风格,突出娱乐内容分享特色,适合各类笑话、段子、搞笑图片等内容展示。查看源码 -
(自适应响应式)环保净化器家用电器网站免费模板针对环保设备、环境监测等领域的PbootCMS响应式模板,通过模块化设计清晰展示污水处理技术、空气净化系统等解决方案。移动端呈现环保数据可视化图表,后端统一管理确保项目案例、技术等资料多端同步。查看源码 -
(自适应)中英文双语外贸扬声器音响喇叭话筒网站模板免费下载为音响设备外贸企业设计的中英文双语网站模板,基于PbootCMS内核开发。适配扬声器系统、音频设备等产品的国际化展示需求查看源码
| 分享笔记 (共有 篇笔记) |