程序员读书

编程概念精讲(二):单点登录(SSO)详解

2020-05-12  本文已影响0人  程序员读书

文章首发于公众号【程序员读书】,欢迎关注。

这是《编程概念精讲》系列第二篇文章,在这篇文章中我们来聊一聊单点登录的机制!

什么是单点登录

为什么需要单点登录

在我们的系统还只是一个单体应用的时候,我们并不需要单点登录的功能,因为系统只有一个,用户在使用系统时只要登录一次就可以了,这时候我们的系统应该是下面这样子的:

image

然而,随着业务的发展,系统会越来越大,于是我们不得不将系统进行拆分,一个庞大的系统会分出不同的子系统,而每个子系统都需要验证用户是否已经登录,这个时候我们系统应该是下面这样子的:

image

可以看出来,在系统拆分后,每个子系统都需要自己的登录功能,这时候可以将登录认证模块单独变成一个系统,访问任何需要登录后才能访问的内容,都是需要先到登录系统进行登录认证成功后才能继续访问,这时候我们的系统会变成下面这样子:

image

这就是所谓单点登录,下面我们来更详细地了解一下。

单点登录的概念

单点登录,英文全称为Single Sign-On,简写为SSO,其定义是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

从上面的定义来看,单点登录的作用就是用户只要一次登录,相关的系统不用再次登录就可以访问,另外,也可以将用户的权限集中管理,而不用在各个子系统中授权。

单点登录的实现

既然我们知道随着业务发展,系统拆分,我们的系统会越来越多,实现单点登录不可能避免,那么要如何实现呢?

要实现单点登录,需要先将登录认证功能单独抽出来,变成一个独立的SSO认证中心,进行登录认证与权限控制,而其他子系统不提供登录认证功能。

当用户访问子系统受限资源时,如果判断未登录,都跳转到认证中心进行登录认证。

一般下面两种实现方式,如下:

同域名下系统的单点登录

如果我们折分后的子系统,部署在同一个一级域名之下,比如order.test.comuser.test.com,就可以利用浏览器中,二级域名或以读取一级域名Cookie的机制来实现单点登录,具体有下面两种做法:

完全使全cookie来实现

登录
  1. 用户访问某个子系统(比如订单管理系统)时,如果没有登录,则跳到SSO认证中心登录认证。
  2. 登录认证成功后,将可以验证用户的信息通过加密后保存到一级域名(在这里是.test.com)的cookie中,并跳到子系统中。
  3. 子系统可以读取到cookie,解密得到用户信息并按校验规则进行校验后判断用户有效,并完成用户登录。
注销

注销的逻辑也比较简单,用户请求SSO认证系统进行登录注销时,SSO认证中心只要删除浏览器上的cookie就可以了。

cookie与session共同参与

单纯通过cookie来实现,并不是很灵活,也并不是很安全,因此也可以配合session一起完全单点登录功能。

这种方式与单纯使用cookie登录差不多,唯一不同的用户登录成功后,cookie保存了sessionid,用户访问时,通过cookie中保存的sessionid访问session中的用户数据,这种方式要求不同的子系统可以访问session。

CAS原理

上面讲的是一种在同域名实现单点登录的方式,比较简单,但如果我们的系统部署在不同的域名下呢?这时候要如何实现单点登录呢?

其实单点登录有一套标准的流程的,叫CAS流程,CAS全称为Central Authentication Service,中文叫中央认证服务器,在这里我们称为SSO认证中心(CAS Server)。

CAS Server提供登录认证功能,各个子系统相当于客户端(CAS Client),在需要用户登录时,向CAS Server发起登录请求。

CAS流程的登录机制

我们假设用户先在订单管理系统上访问受限资源,其登录注销如下:

  1. 用户访问订单管理系统受限制资源。
  2. 订单管理系统判断用户未登录。
  3. 订单管理系统带上用户访问地址,跳转到SSO认证中心登录页面。
  4. 用户输入账号密码认证成功后,建全局会话(cookie),并生成Token。
  5. SSO认证中心携带Token跳转订单管理系统。
  6. 订单管理系统获取Token值,通过SSO认证中心校验Token是否有效,如有效,则创建局部session,完成登录在订单管理系统的登录。

上面流程的示意图如下所示

image

一个子系统登录后,接下来我们来看看另一个子系统的登录流程,我们现在进入的是商品管理系统:

  1. 用户访问商品管理系统受限制资源。
  2. 商品管理系统判断用户未登录。
  3. 商品管理系统带上用户访问地址,跳转到SSO认证中心登录页面,此时会携带上面已经创建的全局Cookie。
  4. SSO认证中心获取Cookie后判断用户已经登录。
  5. SSO认证中心携带Token跳转商品管理系统
  6. 商品管理系统获取Token值,通过SSO认证中心校验Token是否有效,如有效,则创建局部session,完成登录在订单管理系统的登录。

上面示意图如下所示:

image

CAS流程的注销机制

既然有了单点登录,那么就需要单点注销了,单点注销要保证的是在其中一个子系统中注销后,其他子系统的登录状态也会一并注销。

我们仍假设用户在订单管理系统中发起注销登录操作,具体流程如下:

  1. 用户在订单系统中发起注销登录请求。
  2. 订单根据用户在当前系统建立的会话id拿到令牌(Token),向SSO认证中心发起注销请求。
  3. SSO认证中心校验Token是否有效,如果有效则销毁全局会话,同时取出所有用此令牌注册的系统地址。
  4. SSO认证中心向所有注册的子系统发起注销请求。
  5. 各注册系统接收SSO认证中心的注销请求,销毁局部session
  6. SSO认证中心将用户重定向到登录页面(或者其他页面)。

小结

总结一下,通过单点登录,用户只要登录一次,便可能访问不同的系统,而不用多次登录,而实现单点登录,也有两种方式,一个是同域名下的单点登录实现,一种是采用通过的CAS流程,具体选择哪一种,可以根据自己系统的实际需求。


文章首发于公众号【程序员读书】,欢迎关注。

image
上一篇下一篇

猜你喜欢

热点阅读