基于Quarkus的Keycloak新版本如何处理用户会话?
Keycloak 18.0.0 版本用户会话处理逻辑说明
你观察到的SSO_TOKEN表不再写入会话记录是版本迭代后的正常设计变更,不是配置问题,核心逻辑变化如下:
- 旧版(16及更早基于WildFly的版本)确实会将所有用户会话数据持久化到
SSO_TOKEN表中,每次会话校验都需要读取数据库数据,大流量场景下数据库压力很高。 - 从17版本切换到Quarkus架构后,Keycloak重构了整个会话存储层,默认采用缓存优先的两层存储架构,没有沿用旧的
SSO_TOKEN表:- 活跃在线会话默认全部存储在内置Infinispan分布式缓存的内存中,不会主动持久化到关系型数据库。单节点部署下服务重启后所有在线会话会直接失效,集群部署下靠缓存节点间的同步机制保证会话跨节点可用,这也是你在数据库中找不到对应会话记录的核心原因。
- 只有两类会话相关数据默认会持久化到数据库:
- 离线用户会话、离线令牌:对应表为
OFFLINE_USER_SESSION、OFFLINE_CLIENT_SESSION,逻辑和旧版基本一致 - 持久化开关开启后的在线会话:如果你需要和旧版一样把在线会话落盘避免重启丢会话,可以在启动参数中添加
--spi-sessions-infinispan-persistent-sessions=true,开启后在线会话会持久化到USER_SESSION、CLIENT_SESSION两张新表中,完全替代旧版SSO_TOKEN表的作用。
- 离线用户会话、离线令牌:对应表为
补充说明:从旧版本升级到18.0.0时,官方升级脚本只会自动迁移
SSO_TOKEN表中存储的离线会话数据到新表,存量在线会话不会做迁移,升级完成后所有在线用户需要重新登录,属于预期内的行为。
内容的提问来源于stack exchange,提问作者Avishka Perera
相关产品推荐
相关产品推荐

