SSO(单点登录)
# 简介
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
# 优点
- 提高用户效率
- 提高开发人员的效率
- 简化管理
# 缺点
- 不利于重构
- 无人看守桌面
# 常见的单点登录框架
- XXL-SSO (opens new window)
- CAS (opens new window)(Central Authentication Service)
非乐观锁里的CAS(compare and swap)
# xxlsso
大概了解了一下之后,发现cas需要配置http证书,为了方便,所以选择了xxlsso作为单点登录的入门。想参考官方文档 (opens new window)的也可以直接看。
因为单点登录的场景基本是在分布式环境下,所以了解单点登录之前需要对分布式开发有所了解。
# 源码
gitee仓库 (opens new window),跑入门demo可以先clone下来。了解一下流程
# 要求
- jdk:1.7+
- redis:4.0+
# demo结构
- xxl-sso-server:中央认证服务,支持集群
- xxl-sso-core:Client端依赖
- xxl-sso-samples:单点登陆Client端接入示例项目
- xxl-sso-web-sample-springboot:基于Cookie接入方式,供用户浏览器访问,springboot版本
- xxl-sso-token-sample-springboot:基于Token接入方式,常用于无法使用Cookie的场景使用,如APP、Cookie被禁用等,springboot版本
2
3
4
5
# 部署
1.配置认证中心 没什么好说的,把xxlsso-server跑起来先,记得把application.properties的redis地址改成自己的
2.配置client 上面demo结构很清楚了,基于cookie就把web集成到自己的项目中,基于token就换成token的那个demo(细节参考官方文档 (opens new window))
# 架构
登录流程分析
用户于Client端应用访问受限资源时,将会自动 redirect 到 SSO Server 进入统一登录界面 用户登录成功之后将会为用户分配 SSO SessionId 并 redirect 返回来源Client端应用,同时附带分配的 SSO SessionId 在Client端的SSO Filter里验证 SSO SessionId 无误,将 SSO SessionId 写入到用户浏览器Client端域名下 cookie 中 SSO Filter验证 SSO SessionId 通过,受限资源请求放行
注销流程分析
用户与Client端应用请求注销Path时,将会 redirect 到 SSO Server 自动销毁全局 SSO SessionId,实现全局销毁 然后,访问接入SSO保护的任意Client端应用时,SSO Filter 均会拦截请求并 redirect 到 SSO Server 的统一登录界面
基于Cookie,相关概念
登陆凭证存储:登陆成功后,用户登陆凭证被自动存储在浏览器Cookie中 Client端校验登陆状态:通过校验请求Cookie中的是否包含用户登录凭证判断
系统角色模型:
- SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
- Client应用:受SSO保护的Client端Web应用,为用户浏览器访问提供服务
- 用户:发起请求的用户,使用浏览器访问
基于Token,相关概念
登陆凭证存储:登陆成功后,获取到登录凭证(xxl_sso_sessionid=xxx),需要主动存储,如存储在 localStorage、Sqlite 中 Client端校验登陆状态:通过校验请求 Header参数 中的是否包含用户登录凭证(xxl_sso_sessionid=xxx)判断;因此,发送请求时需要在 Header参数 中设置登陆凭证
系统角色模型:
- SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
- Client应用:受SSO保护的Client端Web应用,为用户请求提供接口服务
- 用户:发起请求的用户,如使用Android、IOS、桌面客户端等请求访问
未登录状态请求处理
基于Cookie,未登录状态请求:
页面请求:redirect 到SSO Server登录界面
JSON请求:返回未登录的JSON格式响应数据
数据格式:
- code:501 错误码
- msg:sso not login
基于Token,未登录状态请求:
返回未登录的JSON格式响应数据
数据格式:
- code:501 错误码
- msg:sso not login
todo...