You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:17:06