Keycloak 21.x是否支持x-Protostream编码?缓存配置求助
Keycloak v21.x + Infinispan v14.x 缓存编码配置问题解决
问题背景
在Kubernetes上部署Keycloak v21.x和Infinispan v14.x,此前Keycloak v20.0版本中,Infinispan的sessions分布式缓存、work复制缓存均配置"application/x-jboss-marshalling"编码,运行正常。升级到v21.x后出现转码错误:
2023-05-04 04:03:29,630 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: org.infinispan.commons.dataconversion.EncodingException: ISPN000492: Cannot find transcoder between 'application/x-protostream' to 'application/x-jboss-marshalling'
将缓存编码改为x-protostream后,又触发SASL认证错误:
javax.security.sasl.SaslException: ELY05087: Client selected realm not offered by server (AllowScriptManager)
解决方案
1. 缓存编码的正确选择
Keycloak v21.x及以后版本默认使用Protostream作为序列化协议,不再支持jboss-marshalling作为远程缓存的编码格式,因此Infinispan的所有关联缓存(sessions、work等)必须配置为application/x-protostream编码。
2. 解决SASL认证错误
出现ELY05087错误的核心原因是Keycloak连接Infinispan时的认证上下文不匹配,需做以下调整:
- 验证Infinispan用户权限:确认
developer用户(Keycloak配置中使用的ISPN用户)在Infinispan中拥有目标缓存(sessions、work等)的读写权限。可通过Infinispan控制台或CLI给用户添加对应缓存的WRITE/READ权限。 - 对齐认证领域:检查Infinispan中
developer用户所属的领域是否为default(与cache-ispn-remote.xml中<authentication>节点的realm值一致)。若用户不在default领域,需修改XML中的realm属性为用户实际所属领域。 - 移除冲突配置:在
remote-store配置中删除<property name="rawValues">true</property>,该属性是针对旧版jboss-marshalling的配置,与Protostream序列化冲突。
3. 调整Keycloak缓存配置文件
修改cache-ispn-remote.xml中的sessions缓存配置,示例如下:
<distributed-cache name="sessions" owners="2"> <expiration lifespan="-1"/> <remote-store cache="sessions" xmlns="urn:infinispan:config:store:remote:13.0" fetch-state="false" purge="false" preload="false" shared="true" segmented="false" connect-timeout="${env.KEYCLOAK_REMOTE_ISPN_CONN_TIMEOUT:2000}"> <remote-server host="${env.INFINISPAN_SERVER}" port="${infinispan.bind.port:11222}"/> <security> <authentication> <digest username="${env.KEYCLOAK_REMOTE_ISPN_USERNAME:keycloak}" password="${env.KEYCLOAK_REMOTE_ISPN_PASSWORD:password}" realm="default"/> </authentication> </security> <!-- 保留正确的Marshaller配置,移除rawValues属性 --> <property name="marshaller">org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory</property> </remote-store> </distributed-cache>
4. 清理旧缓存数据
由于此前用jboss-marshalling存储的数据与Protostream不兼容,必须清空Infinispan中sessions、work等缓存的旧数据,避免启动时出现转码异常。可通过Infinispan控制台或执行CLI命令清理:
# 示例:清理sessions缓存 curl -u developer:<password> -X POST http://infinispan-server:11222/rest/v2/caches/sessions/_clear
5. 重启服务验证
重启Keycloak和Infinispan实例,观察日志是否仍有错误。若配置正确,服务应正常启动,无转码和认证异常。
内容的提问来源于stack exchange,提问作者Neelesh Gurjar
相关产品推荐
相关产品推荐

