#979·Sa-Token

sa-token-alone-redis 未实现 SSL/TLS 支持(TLS-only Redis 下连接被服务端直接关闭)

Author: ZackFair5185034Created Sep 14, 2026Updated Sep 14, 2026

使用版本

1.46.0(问题自 1.44.0 起持续存在,已逐一核对 1.44.0 / 1.45.0 / 1.46.0)

涉及的功能模块

sa-token-alone-redis

问题描述

sa-token-alone-redis 没有实现 SSL/TLS。当 Redis 服务端只开 tls-port(即 port 0,禁止明文)时,alone-redis 建立的明文连接会被服务端直接关闭,导致 sa-token 的登录态 / 权限缓存全部不可用。

根因:SaAloneRedisInject.setEnvironment() 自建 Lettuce 连接时只设置了 commandTimeout / shutdownTimeout / poolConfig,从未调用 useSsl() 或设置 sslOptions:

java
LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
builder.commandTimeout(cfg.getTimeout());
builder.shutdownTimeout(lettuce.getShutdownTimeout());
LettuceClientConfiguration clientConfig = builder.poolConfig(poolConfig).build();
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisAloneConfig, clientConfig);
factory.afterPropertiesSet();

版本核对(1.44.0 / 1.45.0 / 1.46.0 该类字节码完全一致)

SaAloneRedisInject.class 的 SHA-256 三个版本完全相同,即两个版本间这段建连逻辑一行未改:

1.44.0  a727faf0dcd09fca83ede1c80d90ac742803d6236facc11550b9d2747976ace4
1.45.0  a727faf0dcd09fca83ede1c80d90ac742803d6236facc11550b9d2747976ace4
1.46.0  a727faf0dcd09fca83ede1c80d90ac742803d6236facc11550b9d2747976ace4

一个容易误导的点

1.44.0 的 spring-configuration-metadata.json 里存在配置项 sa-token.alone-redis.ssl(类型 java.lang.Boolean),看起来像是有开关,但代码从不读取它 —— 它只是旧版 Spring Boot 里 RedisProperties.ssl 还是布尔值时的绑定产物。1.46.0 已移除该 metadata 文件。

现象

org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to <host>/<unresolved>:6379
Caused by: io.lettuce.core.RedisConnectionException: Connection closed prematurely
    at io.lettuce.core.protocol.RedisHandshakeHandler.channelInactive(RedisHandshakeHandler.java:76)

注意这里没有嵌套 SSL 异常 —— 是服务端收到明文后干净断开,而不是握手失败。

期望

sa-token.alone-redis 支持 TLS,建议配置结构与 Spring Boot 保持一致:

yaml
sa-token:
  alone-redis:
    host: 127.0.0.1
    port: 6379
    password: xxx
    database: 11
    ssl:
      enabled: true

现状与参考

  • 相关历史 issue:#373(2023,已关闭,给的是「自己调 SaTokenDaoForRedisTemplate#init(RedisConnectionFactory) / 复制源码改」的 workaround)
  • 社区目前的通用做法确实是绕开这个插件:排除 SaAloneRedisInject,自行 new SaTokenDaoForRedisTemplate()init(自己的 TLS LettuceConnectionFactory)。这样能跑,但等于放弃这个插件本身。

希望能原生支持,谢谢!