mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-06-28 13:34:18 +08:00
10 KiB
10 KiB
SSO模式三 Http请求获取会话
如果既无法做到前端同域,也无法做到后端同Redis,那么可以使用模式三完成单点登录
[!WARNING| label:小提示] 阅读本篇之前请务必先熟读SSO模式二!因为模式三仅仅属于模式二的一个特殊场景,熟读模式二有助于您快速理解本章内容
1、问题分析
我们先来分析一下,当后端不使用共享 Redis 时,会对架构产生哪些影响:
- sso-client 端无法直连 Redis 校验 ticket,取出账号id。
- sso-client 端无法与 sso-server 端共用一套会话,需要自行维护子会话。
- 由于不是一套会话,所以无法“一次注销,全端下线”,需要额外编写代码完成单点注销。
所以模式三的主要目标:也就是在 模式二的基础上 解决上述 三个难题
[!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 端的会话同步。