编程概念精讲(二):单点登录(SSO)详解
文章首发于公众号【程序员读书】,欢迎关注。
这是《编程概念精讲》系列第二篇文章,在这篇文章中我们来聊一聊单点登录
的机制!
什么是单点登录
为什么需要单点登录
在我们的系统还只是一个单体应用的时候,我们并不需要单点登录的功能,因为系统只有一个,用户在使用系统时只要登录一次就可以了,这时候我们的系统应该是下面这样子的:
image然而,随着业务的发展,系统会越来越大,于是我们不得不将系统进行拆分,一个庞大的系统会分出不同的子系统,而每个子系统都需要验证用户是否已经登录,这个时候我们系统应该是下面这样子的:
image可以看出来,在系统拆分后,每个子系统都需要自己的登录功能,这时候可以将登录认证模块单独变成一个系统,访问任何需要登录后才能访问的内容,都是需要先到登录系统进行登录认证成功后才能继续访问,这时候我们的系统会变成下面这样子:
image这就是所谓单点登录,下面我们来更详细地了解一下。
单点登录的概念
单点登录,英文全称为Single Sign-On
,简写为SSO
,其定义是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
从上面的定义来看,单点登录的作用就是用户只要一次登录,相关的系统不用再次登录就可以访问,另外,也可以将用户的权限集中管理,而不用在各个子系统中授权。
单点登录的实现
既然我们知道随着业务发展,系统拆分,我们的系统会越来越多,实现单点登录不可能避免,那么要如何实现呢?
要实现单点登录,需要先将登录认证功能单独抽出来,变成一个独立的SSO认证中心
,进行登录认证与权限控制,而其他子系统不提供登录认证功能。
当用户访问子系统受限资源时,如果判断未登录,都跳转到认证中心进行登录认证。
一般下面两种实现方式,如下:
同域名下系统的单点登录
如果我们折分后的子系统,部署在同一个一级域名之下,比如order.test.com
与user.test.com
,就可以利用浏览器中,二级域名或以读取一级域名Cookie
的机制来实现单点登录,具体有下面两种做法:
完全使全cookie来实现
登录
- 用户访问某个子系统(比如订单管理系统)时,如果没有登录,则跳到
SSO认证中心
登录认证。 - 登录认证成功后,将可以验证用户的信息通过加密后保存到一级域名(在这里是
.test.com
)的cookie中,并跳到子系统中。 - 子系统可以读取到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流程的登录机制
我们假设用户先在订单管理系统上访问受限资源,其登录注销如下:
- 用户访问订单管理系统受限制资源。
- 订单管理系统判断用户未登录。
- 订单管理系统带上用户访问地址,跳转到SSO认证中心登录页面。
- 用户输入账号密码认证成功后,建全局会话(cookie),并生成Token。
- SSO认证中心携带Token跳转订单管理系统。
- 订单管理系统获取Token值,通过SSO认证中心校验Token是否有效,如有效,则创建局部session,完成登录在订单管理系统的登录。
上面流程的示意图如下所示
image一个子系统登录后,接下来我们来看看另一个子系统的登录流程,我们现在进入的是商品管理系统:
- 用户访问商品管理系统受限制资源。
- 商品管理系统判断用户未登录。
- 商品管理系统带上用户访问地址,跳转到SSO认证中心登录页面,此时会携带上面已经创建的全局Cookie。
- SSO认证中心获取Cookie后判断用户已经登录。
- SSO认证中心携带Token跳转商品管理系统
- 商品管理系统获取Token值,通过SSO认证中心校验Token是否有效,如有效,则创建局部session,完成登录在订单管理系统的登录。
上面示意图如下所示:
imageCAS流程的注销机制
既然有了单点登录,那么就需要单点注销了,单点注销要保证的是在其中一个子系统中注销后,其他子系统的登录状态也会一并注销。
我们仍假设用户在订单管理系统中发起注销登录操作,具体流程如下:
- 用户在订单系统中发起注销登录请求。
- 订单根据用户在当前系统建立的会话id拿到令牌(Token),向
SSO认证中心
发起注销请求。 -
SSO认证中心
校验Token是否有效,如果有效则销毁全局会话,同时取出所有用此令牌注册的系统地址。 -
SSO认证中心
向所有注册的子系统发起注销请求。 - 各注册系统接收
SSO认证中心
的注销请求,销毁局部session
。 -
SSO认证中心
将用户重定向到登录页面(或者其他页面)。
小结
总结一下,通过单点登录,用户只要登录一次,便可能访问不同的系统,而不用多次登录,而实现单点登录,也有两种方式,一个是同域名下的单点登录实现,一种是采用通过的CAS流程,具体选择哪一种,可以根据自己系统的实际需求。
image文章首发于公众号【程序员读书】,欢迎关注。