sa-token/sa-token-doc/sso/sso-type3.md
2025-05-08 20:52:52 +08:00

10 KiB
Raw Blame History

SSO模式三 Http请求获取会话

如果既无法做到前端同域也无法做到后端同Redis那么可以使用模式三完成单点登录

[!WARNING| label:小提示] 阅读本篇之前请务必先熟读SSO模式二因为模式三仅仅属于模式二的一个特殊场景熟读模式二有助于您快速理解本章内容

1、问题分析

我们先来分析一下,当后端不使用共享 Redis 时,会对架构产生哪些影响:

  1. sso-client 端无法直连 Redis 校验 ticket取出账号id。
  2. sso-client 端无法与 sso-server 端共用一套会话,需要自行维护子会话。
  3. 由于不是一套会话,所以无法“一次注销,全端下线”,需要额外编写代码完成单点注销。

所以模式三的主要目标:也就是在 模式二的基础上 解决上述 三个难题

[!TIP| label:demo | style:callout] 模式三的 Demo 示例地址:/sa-token-demo/sa-token-demo-sso/sa-token-demo-sso3-client/ 源码链接,如遇难点可参考示例

2、在Client 端更改 Ticket 校验方式

如果想要更直观的感受模式二与模式三的差距,可以把前面章节创建的模式二 demo 代码复制一份,在新复制的项目上继续更改来测试模式三。

2.1、去除 Alone-Redis 依赖

模式三要求 sso-client 与 sso-server 连接不同的 redis所以此处没有必要再引入 sa-token-alone-redis 机制,可以去除相关依赖:

<!-- Sa-Token插件权限缓存与业务缓存分离 -->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-alone-redis</artifactId>
	<version>${sa.top.version}</version>
</dependency>
// Sa-Token插件权限缓存与业务缓存分离
implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}'

2.2、SSO-Client 端更改配置

更改 application.yml

# 端口
server:
    port: 9003
	
# sa-token配置 
sa-token:
    # 打印操作日志
    is-log: true

    # sso-client 相关配置
    sso-client:
        # 应用标识
        client: sso-client3
        # sso-server 端主机地址
        server-url: http://sa-sso-server.com:9000
        # 使用 Http 请求校验 ticket (模式三)
        is-http: true
        # API 接口调用秘钥
        secret-key: SSO-C3-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
		
spring: 
    # 配置 Redis 连接 (此处与 SSO-Server 端连接不同的 Redis
    redis: 
        # Redis数据库索引
        database: 3
        # Redis服务器地址
        host: 127.0.0.1
        # Redis服务器连接端口
        port: 6379
        # Redis服务器连接密码默认为空
        password: 
        # 连接超时时间
        timeout: 10s
# 端口
server.port=9003
	
# sa-token配置 

# 打印操作日志
sa-token.is-log=true

# sso-client 相关配置
# 应用标识
sa-token.sso-client.client=sso-client3
# sso-server 端主机地址
sa-token.sso-client.server-url=http://sa-sso-server.com:9000
# 使用 Http 请求校验 ticket (模式三)
sa-token.sso-client.is-http=true
# API 接口调用秘钥
sa-token.sso-client.secret-key=SSO-C3-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor

# 配置 Redis 连接 (此处与 SSO-Server 端连接不同的 Redis
# Redis数据库索引
spring.redis.database=3
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码默认为空
spring.redis.password=
# 连接超时时间
spring.redis.timeout=10s

2.3、测试

重启项目,访问测试:

[!WARNING| label:小提示] 注如果已测试运行模式二可先将Redis中的数据清空以防旧数据对测试造成干扰

测试步骤同模式二,不再赘述。

3、后记

当我们熟读三种模式的单点登录之后,其实不难发现:所谓单点登录,其本质就是多个系统之间的会话共享。

当我们理解这一点之后,三种模式的工作原理也浮出水面:

  • 模式一:采用共享 Cookie 来做到前端 Token 的共享,从而达到后端的 Session 会话共享。
  • 模式二:采用 URL 重定向,以 ticket 码为授权中介,做到多个系统间的会话传播。
  • 模式三:采用 Http 请求主动查询会话,做到 Client 端与 Server 端的会话同步。