单点登录在我们日常的业务开发中十分常见,单凡需要完成用户中心模块的开发都离不开单点登录,所以本文就来聊聊关于单点登录的那些事儿。首先,我们来看一看用户身份认证有哪些方式。
一、用户身份认证的方式
1. 单一服务器模式
单一服务器模式的实现原理十分简单,只需要将用户的相关登录数据(如用户名)存入session即可。随后服务器向用户返回session_id,session信息都会写入到用户的cookie,用户的每个后续请求都将通过在Cookie中取出session_id传给服务器,服务器收到session_id并对比之前保存的数据,就能够确认用户的身份。
但是单一服务器模式的缺陷也十分明显。一方面是它难以扩展,另一方面是在分布式架构中,需要session共享方案,然而session共享方案都或多或少地存在性能瓶颈,更好的解决方案是用redis做session的统一缓存。
2. SSO(Single Sign On)模式
SSO其实就是我们所说的单点登录模式了,CAS单点登录、OAuth2都属于这种认证方式。通常来说,SSO的定义是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
如图所示,有三个系统分别时业务A、业务B和认证中心(SSO系统)。用户要访问业务A和业务B的资源需要登录时会跳转到SSO认证中心。SSO从用户信息数据库中获取用户信息并校验用户信息,校验成功后就能完成用户登录,然后将用户信息存入缓存(例如redis)。所以当用户访问业务A或业务B,需要判断用户是否登录时,将跳转到SSO系统中进行用户身份验证,SSO判断缓存中是否存在用户身份信息,若判断成功就能访问了。这样,只要其中一个系统完成登录,其他的应用系统也就随之登录了。
我们可以看到,业务与用户认证完成了解耦,用户身份信息独立管理,便于更好的分布式管理。除此之外,还方便自己扩展安全策略。但这种模式也会导致认证服务器的访问压力比较大,可以对认证中心做主从集群。
3. Token模式
Token模式与上面两种认证方式不同,它不需要将认证信息存储在服务器缓存中,而是存储在本地客户端中。如图所示,当用户向授权服务器发送用户名密码等信息完成校验后,授权服务器会返回给客户端一个token信息存在cookie或localStorage中,当用户去访问其他需要登录信息的服务时会在请求头中携带这个token信息,由服务器通过某种统一的方式完成校验。
这种认证方式是无状态的,也就是说服务器一旦给予客户端token,就无法进行回收或删除。这种认证