SSO 单点登录

实现在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录

参考文章:https://blog.csdn.net/qq_41913971/article/details/122609233

sso(Single Sign On)

1、单系统登录

一般的登录授权功能,是通过服务器 tomcat 上的 session 和存储在浏览器 cookie 上的 sessionId 进行校验,在每次请求中通过 sessionId 在 session 中查询是否存在用户的信息,从而校验是否登录

image-20230629104143612

2、单点登录由来

但是增加新的服务器之后,不同的服务器之间的sessionId是不一样的,可能在A服务器上已经登录成功了,能从服务器的session中获取用户信息,但是在B服务器上却查不到session信息,只好退出来继续登录,结果A服务器中的session因为超时失效,登录之后又被强制退出来要求重新登录

image-20230629104446767

3、单点登录实现

单点登录的本质就是在多个应用系统中共享登录状态,如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session 和 Cookie

共享 session

使用 redis 存储 session 信息表,即将用户信息存放在 redis 中,并设置过期时间,这样不同的系统或应用都可以从 redis 中读取到用户登录信息

共享 cookie

​ a. 如果不同系统都用同一个顶级域名,例如:app1.a.com、app2.a.com,则可以在设置 cookie 的时候将 domain 设置为顶级域名 a.com,这样所有子域名的系统都可以访问到这个 cookie 的内容

​ b. 对于不同域名的系统,可以使用浏览器本地缓存,将Token保存在SessionStorage中

CAS 原理

CAS(Central Authentication Service)原理

通过将认证中心独立开来,成为一个系统服务,用作登录和认证功能,即解决 session 的跨域问题,将用户信息存放在这个系统中,用户访问系统1的时候就会重定向到认证中心,在认证中心中登录之后,返回用户 sessionId 存在浏览器中,并且携带 token 重定向到 系统1 上,系统1 在使用 token 去认证中心校验

image-20230629111143294

而当用户访问 系统2 时,当用户未登录时,就会跳转到 认证中心 中,认证中心页面存在对应 cookie,使用 sessionId 获取 token 并重定向到 系统2 中,系统2 再去认证中心校验 token 是否正确,并完成认证功能

image-20230629111406692

实现方式

采用 CAS 方式,使用统一认证系统,采用 jwt 实现跨域认证问题

参考文章:https://www.cnblogs.com/xieqing/p/6519907.html

访问系统A

image-20230629153618579

访问系统B

image-20230629153631690