找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2652|回复: 0

[分享] Discuz!开发之会员登录流程解析

[复制链接]
发表于 2017-11-15 08:35:35 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
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
  1. $ctl_obj = new logging_ctl();//初始化登陆对象,source\class\class_member.php=>class logging_ctl   
  2.    
  3. $ctl_obj->setting = $_G['setting'];  
  4. $method = 'on_'.$_GET['action'];//$method='on_login';  
  5. $ctl_obj->template = 'member/login';  
  6.    
  7. $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进行登录状态记录
  1. $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']返回值进行处理  
  2. ············  
  3. if($result['status'] > 0) //当$result['status']>0时,为登陆成功  
  4. 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函数
  1. function uc_user_login($username, $password, $isuid = 0, $checkques = 0, $questionid = '', $answer = '', $ip = '') {  
  2.     $isuid = intval($isuid);  
  3.     $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函数  
  4.     return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);  
  5. }  
  6. ...................  
  7. function uc_api_mysql($model, $action, $args=array()) {  
  8.     global $uc_controls;  
  9.     if(empty($uc_controls[$model])) {  
  10.         if(function_exists("mysql_connect")) {  
  11.             include_once UC_ROOT.'./lib/db.class.php';  
  12.         } else {  
  13.             include_once UC_ROOT.'./lib/dbi.class.php';  
  14.         }  
  15.         include_once UC_ROOT.'./model/base.php';  
  16.         include_once UC_ROOT."./control/$model.php";//引入uc_client\control\user.php  
  17.         eval("\$uc_controls['$model'] = new {$model}control();");  
  18.     }  
  19.     if($action{0} != '_') {  
  20.         $args = uc_addslashes($args, 1, TRUE);  
  21.         $action = 'on'.$action;  
  22.         $uc_controls[$model]->input = $args;  
  23.         return $uc_controls[$model]->$action($args);//调用uc_client\control\user.php的onlogin函数传参数  
  24.     } else {  
  25.         return '';  
  26.     }  
  27. }  
复制代码
4.uc_client\control\user.php
onlogin函数对数据进行分析,返回结果,回第2步中source\class\class_member.php的
  1. function onlogin() {  
  2.         $this->init_input();  
  3.         $isuid = $this->input('isuid');  
  4.         $username = $this->input('username');  
  5.         $password = $this->input('password');  
  6.         $checkques = $this->input('checkques');  
  7.         $questionid = $this->input('questionid');  
  8.         $answer = $this->input('answer');  
  9.         $ip = $this->input('ip');  
  10.    
  11.         $this->settings['login_failedtime'] = is_null($this->settings['login_failedtime']) ? 5 : $this->settings['login_failedtime'];  
  12.    
  13.         if($ip && $this->settings['login_failedtime'] && !$loginperm = $_ENV['user']->can_do_login($username, $ip)) {  
  14.             $status = -4;  
  15.             return array($status, '', $password, '', 0);  
  16.         }  
  17.    
  18.         if($isuid == 1) {  
  19.             $user = $_ENV['user']->get_user_by_uid($username);  
  20.         } elseif($isuid == 2) {  
  21.             $user = $_ENV['user']->get_user_by_email($username);  
  22.         } else {  
  23.             $user = $_ENV['user']->get_user_by_username($username);  
  24.         }  
  25.    
  26.         $passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);  
  27.         if(empty($user)) {  
  28.             $status = -1;  
  29.         } elseif($user['password'] != md5($passwordmd5.$user['salt'])) {  
  30.             $status = -2;  
  31.         } elseif($checkques && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {  
  32.             $status = -3;  
  33.         } else {  
  34.             $status = $user['uid'];  
  35.         }  
  36.         if($ip && $this->settings['login_failedtime'] && $status <= 0) {  
  37.             $_ENV['user']->loginfailed($username, $ip);  
  38.         }  
  39.         $merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;  
  40.         return array($status, $user['username'], $password, $user['email'], $merge);  
  41.     }  
复制代码
20170411105656578.webp




发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 08:11 , Processed in 0.043705 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表