「架构」 - 淘宝的单点登录系统是怎么设计的

发布于 2021-07-29 12:20

JerryCodes
爆肝面试,技术剖析
107篇原创内容
公众号

SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。


  • 一、SSO概念

  • 二、CAS的原理

  • 三、认证流程

    • A、首次访问受限资源时

    • B、第二次访问该系统

    • C、首次访问其他系统

  • 四、淘宝SSO系统架构设计以及实现

    • A、同步登录状态

    • B、校验登录状态

    • C、验证票据

  • 五、SSO实战


一、SSO概念

单web系统中,客户端与服务器仅建立单一会话,只需要登录成功后写入Cookie,每次请求都携带该Cookie,服务器端只验证Cookie是否有效,即可判断是否登录。

随着业务增长出现了其他应用系统,每个系统只维持自己的会话会出现如下问题:

  1. 每个系统都要维护一套认证逻辑,造成冗余;
  2. 跨系统之后,认证信息失效,需要各个系统之间兼容。

所以需要将公共模块抽象出来,组成一个通用的认证系统,承担起所有业务系统的登录认证功能,也即SSO系统(Single Sign On)。

抽象出认证系统之后,单点登录系统需要完成两个主要工作,全局会话的保持和局部会话的保持。客户端与业务系统之间是局部会话,与SSO系统之间是全局会话。SSO系统分为两部分,SSO服务端和SSO客户端,服务端则SSO认证系统,客户端将集成进入业务系统,负责局部会话的新增、删除、验证。

二、CAS的原理

基本上所有的SSO系统,所会对CAS有所借鉴。

CAS的整体架构分为客户端和服务端。客户端支持多种服务器应用,同时也支持多语言,包括GO、Python、PHP、Java可以看到对市面上的主要语言都有支持。

服务端的技术实现,首先是Spring MVC+Spring Web Flow,Web Flow主要用于将组件串行执行,往下是票据组件、认证组件、认证组件支持的存储容器,可以是LDAP、数据库、活动目录,基本上的认证思路就是关系数据库结合Redis或Memcached来配合实现。

三、认证流程

A、首次访问受限资源时

首次访问时,重定向到SSO服务端登录页,返回登录表单给浏览器,用户提交用户名密码,SSO服务端验证,成功后携带ticket重定向会SSO客户端,客户端与SSO验证ticket有效性,返回验证信息,SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。

如果登录,直接跳转,即执行:

response.sendRedirect(urlToRedirectTo);

B、第二次访问该系统

第二次访问该系统,会在该域名下存在上一步写的cookie,请求该系统时携带cookie,所有filter不会拦截该请求,直接返回资源。

C、首次访问其他系统

在该系统域名下不存在局部会话,所以重定向到SSO服务端,SSO服务端会发现此客户端已经登录,所有生成ticket,客户端与SSO验证ticket有效性,返回验证信息,SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。

四、淘宝SSO系统架构设计以及实现

淘宝的SSO系统是比较有新意的,除了校验登录状态模块,还加入同步登录状态模块,这样就让电商项目在SSO中变得很灵活。

A、同步登录状态

在静态页中,会异步请求后台数据,这时候会被同步登录状态的SSO客户端filter拦截。如果需要同步登录状态,filter将重定向到login.taobao.jump接口,这个接口无论用户是否登录,都会重定向回SSO客户端的接口,在以下两个条件下发生跳转:

  • 局部会话的cookie不存在
  • cookie存在但是无效,全局会话有效

跳转除了携带token参数还会携带来源地址rederectUrl。

B、校验登录状态

当用户请求到需要登录的数据资源时会被校验登录状态的filter拦截,出现以下两种情况:

  1. 同步跳转请求,如果没有登录,直接重定向到登录页
  2. 异步Ajax请求,会直接返回登录状态和rederectUrl、loginUrl,由JavaScript控制跳转到登录地址

C、验证票据

如果SSO服务端登录成功,会携带token请求回SSO客户端,客户端验证token的filter拦截请求,与SSO服务端验证token有效性。如果通过,则返回用户基本信息、cookie 值等,所有的cookie值都是由SSO服务端发出的。

五、SSO实战

目标:基于Token、支持跨顶级域名的SSO系统。

涉及系统:

  1. 登录中心:SSO系统,负责处理SSO全部逻辑,域名为localhost:6061
  2. 业务系统A:某个具体的业务系统,需要通过SSO系统实现登录,域名假定为localhost:6060
  3. 业务系统B:某个具体的业务系统,需要通过SSO系统实现登录,域名假定为localhost:7070

对于业务系统A或业务系统B都能够通过登录中心实现用户登录,并且用户只需要在A和B中的任意一个业务系统进行登录,另一个业务系统就能够自动登录。

参考:

https://github.com/isisiwish/basic-sso

https://github.com/baomidou/kisso

https://github.com/sheefee/simple-sso


已经入职一段时间了,从之前的躺平阶段到现在开始进需求了。给自己定个目标:

1.每天发文章,至少一篇技术文章

2.每天坚持早起,互联网生活确实肝不动,但是早起的鸟儿有虫吃

3.每周运动两次

4.每晚下班看书十页

如果我有以上一条没有做到,第二天我会在我的社群里发一个小红包作为惩罚,也欢迎小伙伴来监督我鞭策我,围观之余领领红包何乐不为,在社群里还可以一起讨论技术一起进步

围观二维码如下,或者直接加我wx  Superren66:


我是一个非科班出身的硕士研究生,凭借自己的努力获得过几大银行及券商所(农行、交行、上交所、招行)、拼多多、网易、鹅厂、字节跳动等offer,有着丰富的国企和互联网科技企业的面试技巧,希望在这个公众号你也能找到属于你的offer。

JerryCodes
爆肝面试,技术剖析
107篇原创内容
公众号

本文来自网络或网友投稿,如有侵犯您的权益请联系邮箱:wyl860211@qq.com,我们将第一时间删除。

相关素材