多模块web系统登录设计

前面在《单web应用系统登录设计》中,都是从一个小型独立的web系统角度做的登录设计。要么是借助三方账号系统的Oauth2.0能力,要么是作为一个子业务系统直接使用单点登录的能力。

今天这一篇文章所要总结讲述的,就是如何在一个多模块web系统中,构建用户登录能力的技术方案。

SSO单点登录设计

认识SSO机制

对于对于一个大型的系统,往往具备两个及以上的产品或子业务系统。将其中的用户登录逻辑抽离出来,统一在一个页面进行一次页面登录,就能同时在各个子业务系统中达到登录的效果。

打个比方,SSO 和我们去游乐园时购买的通票很像。

多模块web系统登录设计——SSO体验流程1.png

我们只要买一次通票,就可以玩所有游乐场内的设施,而不需要在过山车或者摩天轮那里重新买一次票。在这里,买票就相当于登录认证,游乐场就相当于使用一套 SSO 的公司,各种游乐设施就相当于公司的各个子业务系统。

多模块web系统登录设计——SSO体验流程2.png

同域下的单点登录

对于同域下的单点登录,因为cookie可以同域共享,因此可以通过共享会话的形式快速构建该能力。
即用户模块完成用户登录后,在一级域名下设置cookie, 用户在访问时业务模块时,携带该cookie,从共享session会话中获取用户登录凭证。

但在大型的web应用中,sessoin会话在不同模块中共享是不安全的。其他业务模块往往通过服务互信的方式来获取用户凭证。和token鉴权或oauth鉴权模式一样,仍然需要走到用户模块去进行鉴权。在SSO的术语中,提供鉴权的用户模块又可以叫CAS(Central Authentication Service)。下面,就梳理一下CAS的交互流程。

CAS (Central Authentication Service)

术语解释

TGT:Ticket Grangting Ticket

TGT 是 CAS 为用户签发的登录票据,拥有了 TGT,用户就可以证明自己在 CAS 成功登录过。TGT 封装了 Cookie 值以及此 Cookie 值对应的用户信息。当 HTTP 请求到来时,CAS 以此 Cookie 值(TGC)为 key 查询缓存中有无 TGT ,如果有的话,则相信用户已登录过。

TGC:Ticket Granting Cookie

CAS Server 生成TGT放入自己的 Session 中,而 TGC 就是这个 Session 的唯一标识(SessionId),以 Cookie 形式放到浏览器端,是 CAS Server 用来明确用户身份的凭证。

ST:Service Ticket

ST 是 CAS 为用户签发的访问某一 service 的票据。用户访问 service 时,service 发现用户没有 ST,则要求用户去 CAS 获取 ST。用户向 CAS 发出获取 ST 的请求,CAS 发现用户有 TGT,则签发一个 ST,返回给用户。用户拿着 ST 去访问 service,service 拿 ST 去 CAS 验证,验证通过后,允许用户访问资源。

CAS实现会话登录的步骤:

多模块web系统登录设计——SSO登录会话步骤.png
  1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

  2. sso认证中心发现用户未登录,将用户引导至登录页面

  3. 用户输入用户名密码提交登录申请

  4. sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌。
    (该步骤即创建了TGC(全局会话cookie)/TGT(全局会话session)/ST(授权令牌)

  5. sso认证中心带着令牌跳转会最初的请求地址(系统1)

  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效

  7. sso认证中心校验令牌,返回有效,注册系统1

  8. 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源

  9. 用户访问系统2的受保护资源

  10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

  11. sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌

  12. 系统2拿到令牌,去sso认证中心校验令牌是否有效

  13. sso认证中心校验令牌,返回有效,注册系统2

  14. 系统2使用该令牌创建与用户的局部会话,返回受保护资源

(这里的流程仅展示了子业务系统内访问自己的受保护资源的方式。对于子业务系统内访问其他业务系统的受保护资源,其实现原理及方案则需要引入Oauth2.0机制,这里不做细究。)

用户登录成功之后,会与sso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为全局会话,用户与各个子系统建立的会话称为局部会话,局部会话建立之后,用户访问子系统受保护资源将不再通过sso认证中心,全局会话与局部会话有如下约束关系:

  1. 局部会话存在,全局会话一定存在
  2. 全局会话存在,局部会话不一定存在
  3. 全局会话销毁,局部会话必须销毁

第1点和第2点,因为局部会话都是由子业务系统向认证中心主动发起鉴权,所以说天然满足。但对于第3点,则需要一个通知机制,从认证中心向子业务系统发出。

CAS实现会话注销的步骤

多模块web系统登录设计——SSO注销会话步骤.png
  1. 用户向系统1发起注销请求
  2. 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
  3. sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
  4. sso认证中心向所有注册系统发起注销请求
  5. 各注册系统接收sso认证中心的注销请求,销毁局部会话
  6. sso认证中心引导用户至登录页面

因为这个通知机制,需要在认证中心额外存储ST与注册系统的映射关系,并通过异步消息队列完成通知。对应的业务系统也得维护这个局部会话的时效性。

CAS的技术能力

CAS采用客户端/服务端架构

CAS Client:

  1. 拦截子系统未登录用户请求,跳转至sso认证中心
  2. 接收并存储sso认证中心发送的令牌
  3. 与CAS Server通信,校验令牌的有效性
  4. 建立局部会话
  5. 拦截用户注销请求,向sso认证中心发送注销请求
  6. 接收sso认证中心发出的注销请求,销毁局部会话

CAS Server:

  1. 验证用户的登录信息
  2. 创建全局会话
  3. 创建授权令牌
  4. 与CAS Client通信发送令牌
  5. 校验CAS Client令牌有效性
  6. 系统注册
  7. 接收CAS Client注销请求,注销所有会话

统一网关+授权中心

对于一个使用微服务架构的大型系统来说,相比于独立一个CAS服务,构建一个API网关可能是一个更优雅的解决方案。将用户的认证鉴权统一到网关模块进行统一处理,

鉴权逻辑描述

  1. 当客户端第一次请求服务时,网关发现未携带token,向授权中心请求授权
  2. 客户端完成对用户进行信息认证(登录)
  3. 认证通过,将用户信息进行签名加密形成token,返回给客户端
  4. 客户端每次请求,都携带认证的token
  5. 发送给服务端的请求,首先经过网关,网关向授权中心发起鉴权,鉴权通过则放行。


    多模块web系统登录设计——Web网关鉴权.png

该方案之于SSO,就犹如token鉴权之于session会话管理。该方案相较于CAS模式,有一个天然的优势,即同时支持多端的登录鉴权。

单设备登录设计

对于一些敏感应用,需要有一定的风控措施,例如说仅允许单设备登录。对应于web端,相当于仅允许一个登录凭证或sessionId有效,你如果换了浏览器或异地登录,系统则需要将以前的会话踢出,并警示风险。

在CAS模式下,这需要SSO认证中心内缓存的userId与ST的映射关系再添加上一些其他信息。例如将userId和全局sessionId一起作为key来检索ST, 则可以保证换了浏览器或主机的情况下可以识别到重复登录了,如果将urserId和ip一起作为key来检索ST,则可以保证同一时刻异地登录可以得到检测。

同理,网关token模式下,可以将userId和token/ip一起做key来检索用户登录凭证。而在App侧,单设备登录可以控制得更加精细。

当然,如果收集更多用户登录的环境信息或历史行为信息,可以更精准地对用户做风险控制。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容