SSO(单点登录)

11/27/2019 SSO

# 简介

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

# 优点

  • 提高用户效率
  • 提高开发人员的效率
  • 简化管理

# 缺点

  • 不利于重构
  • 无人看守桌面

# 常见的单点登录框架

  1. XXL-SSO (opens new window)
  2. CAS (opens new window)(Central Authentication Service)

非乐观锁里的CAS(compare and swap)

# xxlsso

大概了解了一下之后,发现cas需要配置http证书,为了方便,所以选择了xxlsso作为单点登录的入门。想参考官方文档 (opens new window)的也可以直接看。

因为单点登录的场景基本是在分布式环境下,所以了解单点登录之前需要对分布式开发有所了解。

# 源码

gitee仓库 (opens new window),跑入门demo可以先clone下来。了解一下流程

# 要求
  1. jdk:1.7+
  2. 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版本
1
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...