Keycloak对接远程Infinispan缓存时出现ClassCastException问题求助
Keycloak对接Infinispan远程缓存ClassCastException问题解决
问题原因
你的配置存在两个核心问题:
- 缓存映射错误:Keycloak所有类型的会话缓存(sessions、authenticationSessions、offlineSessions等)的远程store都配置了
cache=actionTokens,导致不同类型的会话数据全部存入Infinispan的actionTokens缓存中。当Keycloak尝试从对应缓存读取数据时,拿到的是其他类型的数据(甚至是布尔值标记),无法转换为预期的SessionEntityWrapper或RootAuthenticationSessionEntity,触发ClassCastException。 - 版本兼容性不匹配:Keycloak 16.1.1官方适配的Infinispan版本为12.x系列(如12.1.12.Final),你使用的Infinispan 14属于跨大版本升级,存在序列化协议、API兼容性问题,会加重类型转换异常。
修复步骤
1. 修正Keycloak远程缓存映射配置
将每个缓存的远程store的cache参数修改为与Keycloak缓存同名的值,示例如下:
# 修正work缓存远程store /subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:write-attribute(name=cache, value=work) # 修正sessions缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:write-attribute(name=cache, value=sessions) # 修正authenticationSessions缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions/store=remote:write-attribute(name=cache, value=authenticationSessions) # 修正offlineSessions缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:write-attribute(name=cache, value=offlineSessions) # 修正clientSessions缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:write-attribute(name=cache, value=clientSessions) # 修正offlineClientSessions缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:write-attribute(name=cache, value=offlineClientSessions) # 修正loginFailures缓存远程store /subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:write-attribute(name=cache, value=loginFailures) # actionTokens缓存保持原配置即可 /subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:write-attribute(name=cache, value=actionTokens)
2. 清理Infinispan缓存数据
删除Infinispan中actionTokens缓存的所有旧数据(因为之前混入了其他类型的会话数据),可以通过Infinispan控制台或CLI执行:
# 假设使用Infinispan CLI连接集群后执行 cache clear --cache=actionTokens
3. 调整Infinispan版本至兼容版本
将Infinispan集群降级至Keycloak 16.1.1适配的版本(推荐12.1.12.Final),避免跨版本序列化协议不兼容问题。如果无法降级,需要确保Infinispan的序列化配置完全匹配Keycloak要求:
- 保持Infinispan的
GenericJBossMarshaller配置,确保allow-list包含所有Keycloak相关类。 - 验证HotRod协议版本与Keycloak配置的
protocolVersion=${env.HOTROD_VERSION:2.8}匹配(Infinispan 14默认支持HotRod 2.8,但需确认)。
4. 重启服务
重新启动Keycloak和Infinispan集群,确保配置生效。
验证
- 登录Keycloak管理控制台,查看用户会话列表,确认无ClassCastException错误。
- 模拟用户登录、登出操作,检查会话数据正常存入/读取Infinispan对应缓存。
内容的提问来源于stack exchange,提问作者revdev
相关产品推荐
相关产品推荐

