ucenter采用MVC架构,多数用于同步各个应用中的用户数据,实现用户的一站式注册、登录、退出以及社区其他数据的交互。

简单分析

index.php入口文件

$m = getgpc('m'); //判断加载哪一个Model
$a = getgpc('a'); //判断加载哪一个Control
if(empty($m) && empty($a)) {header('Location: admin.php');exit;
}...//加载基类,基类中定义了很多的方法,所有控制器类都继承于该基类
if(file_exists(UC_ROOT.RELEASE_ROOT.'model/base.php')) {require UC_ROOT.RELEASE_ROOT.'model/base.php';
} else {require UC_ROOT.'model/base.php';
}...//判断是否加载的是指定的model
if(in_array($m, array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed', 'friend', 'domain', 'credit', 'mail', 'version'))) {if(file_exists(UC_ROOT.RELEASE_ROOT."control/$m.php")) {include UC_ROOT.RELEASE_ROOT."control/$m.php";} else {include UC_ROOT."control/$m.php";}$classname = $m.'control'; //构造control类,如$m=user时control就为usercontrol$control = new $classname();$method = 'on'.$a; //构造方法名if(method_exists($control, $method) && $a{0} != '_') {$data = $control->$method();echo is_array($data) ? $control->serialize($data, 1) : $data;exit;} elseif(method_exists($control, '_call')) { //如果方法存在且不是私有方法则执行该方法$data = $control->_call('on'.$a, '');echo is_array($data) ? $control->serialize($data, 1) : $data;exit;} else {exit('Action not found!');}
}

例子
xxx/index.php?m=user&a=login
这样,就会初始化usercontrol并调用onlogin方法。

model层直接与数据库交互,control层与model层交互,得到结果,返回给view。
如果我们要扩展自己的方法该怎么办?
首先,增加model类,定义我们所需要的方法,直接与DB进行交互。
其次,增加control类,并继承自base,定义on{xxxx}方法,与相对的model交互,并返回结果。


同步登录通信原理

原文参考地址:http://www.jb51.net/article/54297.htm

discuz登录为例的流程:

  • 用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证
  • 如果验证成功,将调用文件路径为uc_client/client.php中的函数uc_user_synlogin,在这个函数中调用 uc_api_post('user', 'synlogin', array('uid'=>$uid))
  • 然后这个函数后向Ucenter的index.php传递数据,index.php接受传递的数据,获得model为user,action为synlogin的值。
  • 然后Ucenter的index.php调用control/user.php类中的onsynlogin方法,通过foreach循环,以生成javascript(<script type="text/javascript" src="{应用url?time=时间戳&code=含有用户信息的加密字符串}"></script>)并加载的方式通知uc应用列表中开启同步登陆的应用进行同步登录;即通过get方式传递给各个应用目录中api下的uc.php一些数据。
  • uc.php接收通知并处理get过来的数据,用authcode对url中参数code进行解密得出用户信息,以存cookie等方式进行同步登录。

用户信息加密解密使用的函数

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));}
}

authcode()的四个参数,一般情况下只用到前三个:
$string 提供需要加密的字符串
$operation 加密方式,ENCODE是加密,DECODE是解密
$key 密钥,在整合程序时填写的密钥。


ucenter 简单分析与同步机制相关推荐

  1. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  2. 内核同步机制-RCU同步机制

    转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...

  3. Libvirt同步机制 —— 实现原理

    文章目录 前言 VM同步 数据结构 接口 同步任务 数据结构 qemuDomainJob qemuDomainJobObj 接口 异步任务 数据结构 qemuDomainAsyncJob qemuDo ...

  4. VxWorks中信号量实现任务间通信与同步机制分析

    引 言 多任务内核.任务调度机制.任务间通信和中断处理机制,这些都是VxWorks运行环境的核心.多任务处理和任务间通信是实时操作系统的基石.一个多任务环境允许将一个实时应用构造成一套独立任务的集合, ...

  5. MySQL系列:innodb源代码分析之线程并发同步机制

    innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...

  6. ExoPlayer播放器剖析(六)ExoPlayer同步机制分析

    关联博客 ExoPlayer播放器剖析(一)进入ExoPlayer的世界 ExoPlayer播放器剖析(二)编写exoplayer的demo ExoPlayer播放器剖析(三)流程分析-从build到 ...

  7. Android Handler机制简单分析

    丨版权说明 : <Android Handler机制简单分析>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 本文一切从简,将围绕以下流程展开叙述: what why how ...

  8. futex同步机制分析之一应用

    futex同步机制分析之一应用 一.多线程(进程)的同步机制 c++编程中最难的部分有哪些,估计绝大多数人都会首先提出来是多线程(进程)编程.为什么多线程编程难呢?一个主要的原因就是多线程的同步.在多 ...

  9. Redis 数据同步机制分析

    Redis的主从同步机制可以确保redis的master和slave之间的数据同步.按照同步内容的多少可以分为全同步和部分同步:按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数 ...

最新文章

  1. 馅饼还是陷阱,TMG2010升级经验谈
  2. 从上市公司数据读懂我国新兴产业发展态势
  3. 2016-8-13第二周作业
  4. 安装完Pycharm,启动时碰到“failed to load jvm dll“的解决方案
  5. 42岁著名黑客去世,曾拯救互联网:揭开索尼“罪行”、发现DNS漏洞
  6. python类中self是什么
  7. ThinkPHP调用连连支付
  8. PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
  9. c语言double root,C语言修仙
  10. SpringCloudSpringBootmybatis分布式微服务云架构-hystrix参数详解
  11. JAVA对MYSQL进行连接、插入、修改、删除操作
  12. maya python api_[转载]maya python api 学习笔记
  13. Julia : 进制之间转换
  14. nginx伪静态php如何配置文件,nginx实现thinkphp伪静态的配置例子
  15. Win10磁盘分区工具-无损分区助手
  16. Origin简单绘图
  17. 详细Gitee(码云)使用方法
  18. centos mysql 绿色版安装_centos7环境下mysql5.7的安装与配置(免安装版)
  19. 万事开头难 实践出真知
  20. HDU - 6638

热门文章

  1. 【日常】矩阵正态分布参数检验问题
  2. Dcloud学习资料汇总+视频教程
  3. nginx服务器,访问目录下php文档会直接下载,而不是转到页面
  4. 遗传算法介绍(内含实例)
  5. JS中的pipe原理
  6. 微信小程序接入微信支付流程
  7. 微信小程序----微信小程序浏览pdf文件
  8. 自然语言处理--词向量
  9. vue——echarts更换主题
  10. Ubuntu Server 20.04 安装桌面(图形界面) 以及 远程桌面