定义/需求
单点登录(Single Sign On,简称SSO),用户只需要登录一次,就可以直接访问所有互相信任的系统。
应对难题/技术背景
-
传统的单系统tomcat登录
- 登录时,将用户信息保存在session对象
- 退出时,从session中删除用户信息
-
多个系统,session不共享
解决方案
| 选项 | 内容 | 优缺点 |
|---|---|---|
| 方案一 | tomcat集群,实现session全局复制 | 影响集群性能 |
| 方案二 | 根据请求ip,映射到同个服务器 | 某台机器宕机,该机器保存的session丢失 |
| 方案三 | session数据存到redis | |
| 方案四 | 单点登录 |
设计场景
场景一 自身内部子系统互相登录
前端所有具体的业务请求,都会被认证中心拦截(有些是通过 网关+鉴权服务 实现),会先判断是否登录。
如果登录成功,直接进入对应的子系统,无需再登录;
如果未登录,则跳转到登录页面。
类似 spring 微服务架构,网关统一鉴权。
场景二 当前系统被集成到第三方系统
在第三方系统,点击按钮,跳转到当前系统。
场景三 独立认证中心管理多系统登录
最典型、最常用
登录流程
系统1登录:
-
用户输入用户名密码提交登录申请
-
认证中心校验用户信息,创建用户与认证中心之间的会话,称为全局会话,同时创建授权令牌
-
认证中心带着令牌跳转会最初的请求地址(系统1)
-
系统1拿到令牌,去认证中心校验令牌是否有效
-
认证中心校验令牌,返回有效,注册系统1
-
系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
系统2登录:
-
用户访问系统2的受保护资源
-
系统2发现用户未登录,跳转至认证中心,并将自己的地址作为参数
-
认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
-
系统2拿到令牌,去认证中心校验令牌是否有效
-
认证中心校验令牌,返回有效,注册系统2
-
系统2使用该令牌创建与用户的局部会话,返回受保护资源
未登录流程
校验未登录、token过期的处理流程如下:
-
用户访问系统1的受保护资源,系统1发现用户未登录,跳转至认证中心,并将自己的地址作为参数
-
认证中心发现用户未登录,将用户引导至登录页面
退出登录流程
退出登录的流程如下:
-
客户端发起请求退出系统
-
系统1根据用户与系统1建立的会话id拿到令牌,向认证中心发起注销请求
-
认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
-
认证中心向所有注册系统发起注销请求
-
各注册系统接收认证中心的注销请求,销毁局部会话
-
认证中心引导用户至登录页面
全局会话与局部会话有如下约束关系
-
局部会话存在,全局会话一定存在
-
全局会话存在,局部会话不一定存在
-
全局会话销毁,局部会话必须销毁
场景四 第三方系统账号登录当前系统
同场景三