用户中心++详细设计文档.docx
《用户中心++详细设计文档.docx》由会员分享,可在线阅读,更多相关《用户中心++详细设计文档.docx(17页珍藏版)》请在冰豆网上搜索。
![用户中心++详细设计文档.docx](https://file1.bdocx.com/fileroot1/2023-2/4/44c16a2a-90f5-4ba5-aa1e-0d806bb6dff7/44c16a2a-90f5-4ba5-aa1e-0d806bb6dff71.gif)
用户中心++详细设计文档
用户中心详细设计
1引言
1.1编写目的
本详细设计说明书是针对用户中心系统而编写的,主要目的是描述清楚系统的详细设计,明确系统的结构、模块的划分、各个模块的功能,并确定实现系统所需的各种细节,以及各个相关开发实现人员的职责范围,协调不同部门之间的协同工作,以便所有实现者可以根据本文档直接着手进行自己相应开发任务。
1.2背景
系统名称:
用户中心
简介:
用户中心是一个将阿里巴巴中文站、国际站、ITBU各产品线等用户整合在一起的,提供统一的用户相关操作功能,包括中文站、国际站到ITBU对用户透明的免登功能、用户信息查询功能等,以为所有阿里巴巴的用户提供更好的用户体验,连同计费中心、产品中心等,共同成为阿里巴巴“建国大业”项目的重要组成部分,是阿里巴巴未来十年战略起步的重要基础建设。
系统可能的主要开发者、相关者:
阿里巴巴ITBU、ITBU各产品线、中文站(CCBU)、国际站(ICBU)等。
1.3专用术语定义
文档中出现的longid均指memberid,site指domain
2系统需求
2.1业务场景
2.1.1免登
⏹从ICBU/CCBU免登录到ITBU(单向)
一个在ICBU/CCBU已经登录成功的用户,点击ICBU/CCBU网站页面或ITBU页面上的一个链接,直接免登录到ITBU,而不需要再次登录。
⏹从旺旺聊天面板免登录到ITBU
用户点击阿里旺旺聊天窗口内的一个链接,能直接免登录到ITBU,不需要重新登录一次。
2.1.2UDB
⏹由业务模块远程调用用户信息相关接口
由业务模块,比如ITBU的E网打进、外贸版等产品线的业务通过远程调用UDB模块的接口,来查询用户状态,包括以下各种功能:
1.查询当前登录用户的会话信息
2.获取用户信息资料
3.注册CCBU/ICBU新用户
4.用户登录(校验用户名和密码)
5.一个已经登录的用户进行手动登出系统的操作支持
6.ITBU提供对对用户透明的在CCBU/ICBU修改用户资料、修改密码、用户登录和查看用户资料的功能
⏹系统内部免登录模块和UDB模块之间的访问
UDB模块需要提供给免登录模块相应的用户登录接口
2.1数据迁移需求
由于在此之前已经有用户系统,新的用户中心的开发需要考虑新老数据的迁移问题,必须将原有的数据安全、平滑地迁移到新系统中来。
3设计方案
3.1系统结构
用户免登一共分3模块,ITBU模块,CCBU/ICBU模块,TokenService模块。
具体模块关系图如图3-1:
图3-1具体模块关系
3.2模块划分
3.2.1UDB模块
登录流程:
1.根据siteid,loginid匹配唯一的userid,若userid不存在就创建一个;
2.将userid,siteid,loginid,还有当前时间戳等信息组合,通过加密算法生成当前的登录上下文信息;
3.将登录上下文信息保存到response的cookie中,在客户端记录以方便后期的查询。
、
图3-2UDB用户登录模块流程图
3.2.2免登录模块
该模块主要解决用户从CCBU/ICBU网站免登到ITBU页面模块。
主要采用token+签名机制保证免登的安全性。
CCBU/ICBU和TokenService,ITBU3个模块分别部署在3台不同应用上。
token目前保存在MemCached中,外部访问全部走https.免登步骤与事例如下:
1.用户Browser → CCBU/ICBU eg:
2.传参校验,生成保存token至Memcached.
3.用户Browser →ITBUeg:
4.token,ip,ref参数校验,从MemCached中取ip,ref跟当前Request的ip,ref做参数校验
5.用户Browser →钱掌柜/外贸版/E网打尽 eg:
图3-3用户免登录模块顺序图
图3-4用户免登录模块流程图
4详细设计
4.1接口设计
4.1.1内部接口设计
4.1.1.1UDB模块
4.1.2.1.1.1AuthCookie内容设计
Authcookie用来存放udb的sessionid,保存格式:
cookie名称:
udb:
az
存放内容:
1.Siteid
2.Loginid
3.Userid
4.用户显示名称
将以上三个数据用AES的方式加密压缩后存储在Cookie中
sid之前加上名称前缀udb,防止该cookie的值被业务模块不小心覆盖。
publicinterfaceIUserService{
/**
*获得当前的登录用户信息
*@paramrequest
*@returnAuthCookie
*/
publicAuthCookiegetAuthCookie(HttpServletRequestrequest);
/**
*根据userId获取用户资料
*@paramuserId
*@returnUserProfileResult
*/
publicUserProfileResultgetUserProfileByUserId(StringuserId);
/**
*根据siteid,loginid和用户资料注册新用户
*@paramsiteid
*@paramloginid
*@paramprofile
*@returnUserResult
*/
publicUserResultregister(Stringsiteid,Stringloginid,Mapprofile);
/**
*通过用户的loginid、siteid和密码验证用户的有效性
*@paramsiteid
*@paramloginid
*@parampasswd
*@returnUserResult
*/
publicUserResultvalidate(Stringsiteid,Stringloginid,Stringpasswd);
/**
*根据siteid和loginid查询对应的userid
*@paramsiteid
*@paramloginid
*@returnUserResult
*/
publicUserResultgetUserIdByLongId(Stringsiteid,Stringloginid);
/**
*根据userid查询对应的longid(siteid和loginid)
*@paramuserid
*@returnLongIdResult,包含:
*1、一个String类型的siteid
*2、一个String类型的loginid
*3、一个int类型code,表明状态
*/
publicLongIdResultgetLongIdByUserId(Stringuserid);
}
4.1.1.2免登录模块
1.TokenService内部接口
/**
*目标URL的白名单校验
*@paramtoURL–目标地址
*/
privatebooleanvalidateURL(StringtoURL);
/**
*生成token,sign并存入MemCached
*@paramip–发起端ip
*@paramref–发起端具体url地址
*@paramsite–网站标识
*@paramtoURL–目标端url
*@returnMap–null则失败,否则返回(token:
xxxx,sign:
xxx)
*/
privateMapgenerateAndSaveToken(Stringip,Stringref,Stringsite,StringtoURL,Stringsign)
/**
*删除token从MemCached
*@paramtoURL–目标地址
*/
privatebooleandeleteToken(Stringtoken);
4.1.2外部接口设计
4.1.2.1对外提供的接口
4.1.2.1.1UDB模块
4.1.2.1.2免登录模块
TokenService提供以下2个REST接口服务:
publicinterfaceITokenService{
/**
*
校验目标URL
*
生成并保存Token
*@returnTgResult
*/
publicTgResultgenerateTvsURL(StringloginId,Stringsite,StringtoURL,Stringref,Stringip);
/**
*根据传入token,ip,ref校验正确性,传入token在MemCache查询各个参数,再进行参数比对.
*@paramtoken
*@paramsign
*@paramip
*@paramref
*@returnTvResult
*/
publicTvResultvalidate(Stringtoken,Stringip,Stringref,Stringsign);
}
4.1.2.2需要依赖的外部接口
4.1.2.2.1CCBU/ICBU需提供的接口
⏹获取用户资料
⏹注册用户
⏹密码验证
⏹判断用户名
4.1.2.3接口返回结果的设计
TgResult对象设计
publicclassTgResult{
publicfinalstaticintSUCCESS=0;
publicfinalstaticintINVALID_TOURL=1;
publicfinalstaticintMEMCACHED_COMMUNICATED_ERROR=2;
publicfinalstaticintINVALID_TVS_URL=3;
privateintresultCode;
privateStringtvsURL;
privateStringmessage;
publicintgetResultCode(){
returnresultCode;
}
publicvoidsetResultCode(intresultCode){
this.resultCode=resultCode;
}
publicStringgetTvsURL(){
returntvsURL;
}
publicvoidsetTvsURL(StringtvsURL){
this.tvsURL=tvsURL;
}
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
}
TvResult对象设计
publicclassTvResult{
publicfinalstaticintSUCCESS=0;
publicfinalstaticintINVALID_IP=1;
publicfinalstaticintINVALID_REF=2;
publicfinalstaticintINVALID_TOKEN=3;
publicfinalstaticintINVALID_SIGN=4;
publicfinalstaticintMEMCACHED_COMMUNICATED_ERROR=5;
privateintresultCode;
privateStringloginId;
privateStringsite;
privateStringtoURL;
privateStringmessage;
publicintgetResultCode(){
returnresultCode;
}
publicvoidsetResultCode(intresultCode){
this.resultCode=resultCode;
}
publicStringgetLoginId(){
returnloginId;
}
publicvoidsetLoginId(StringloginId){
this.loginId=loginId;
}
publicStringgetSite(){
returnsite;
}
publicvoidsetSite(Stringsite){
this.site=site;
}
publicStringgetToURL(){
returntoURL;
}
publicvoidsetToURL(StringtoURL){
this.toURL=toURL;
}
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
}
AuthCookie对象设计
publicclassAuthCookie{
privateStringsiteId;
privateStringloginId;
privateStringuserId;
publicintgetSiteId(){
returnsiteId;
}
publicStringgetLoginId(){
returnloginId;
}
publicStringgetUserId(){
returnuserId;
}
}
UserResult对象设计
publicclassUserResult{
privateintcode;
privateStringuserId;
publicStringgetCode(){
returncode;
}
publicStringgetUserId(){
returnuserId;
}
}
LongIdResult对象设计
publicclassLongIdResult{
privateStringcode;
privateStringsiteId;
privateStringloginId;
publicStringgetCode(){
returncode;
}
publicStringgetSiteId(){
returnuserId;
}
publicStringgetLoginId(){
returnloginId;
}
}
4.2数据迁移
4.2.1数据迁移说明
在系统上线之前,需要将原udb的数据库中的userid和longid的对应关系导入到新的数据表中,以便新系统调用。
4.2.2方案描述
将udb这张表中的两列字段迁移到udb的新表中即可,忽略原有的udb_user_binding关系,存在userid的一对多的对因关系,新的udb中不记录userid和longid的一对多关系,仅保存唯一对应关系。
4.2.3数据库设计
数据表仅保留userid和longid的唯一对应关系,数据库表设计如下:
字段
●USER_ID:
PKvarchar2(20)
●SITE_ID:
varchar2(16)
●LOGIN_ID:
varchar2(64)
4.3缓存设计
4.3.1采用技术
缓存采用memCached内存数据库
4.3.2详细方案
1.第3方jar依赖:
用户免登采用memCached的client&server端。
2.cache存储结构设计:
key:
token
value:
{
“userid”:
xxx,
”site”:
xxx,
”token”:
xxx,
”toURL”:
xxx,
”ref”:
xxx,
”ip”:
xxx,
”sign”:
xxx
}
4.4安全级别设计
1.用户browser请求CCBU/ICBU/ITBU流程都走https加密传输过程.
2.增加toURL参数白名单校验。
3.增加srcSite参数校验。
4.token有有效时间,例如token的有效时间是10秒(时间可配置),10秒之后才来校验该token返回失败。
5.签名机制,对所有传参做签名。
6.token一次有效性:
即token被使用(验证)过一次之后,以后再也没用了。
每当validate动作触发并校验成功后token被删除。