升级Keycloak至22.0.0遇NoSuchFieldError:FIPS问题求助
解决Keycloak 22.0.0升级后
NoSuchFieldError: FIPS问题 问题根源
Keycloak 22.x版本对安全模块做了重构,移除或重命名了旧版本里的FIPS常量字段,你使用的第三方HTTP事件监听器jar直接引用了这个字段——哪怕更新了pom依赖版本,jar包编译后的代码仍保留对旧字段的引用,最终导致类加载冲突。
具体解决思路
修改监听器代码中的旧字段引用
- 拉取第三方监听器源码,搜索所有引用
FIPS字段的位置(通常关联org.keycloak.common.util.SecurityConstants类)。 - 对照Keycloak 22.x源码确认替代方案:
- 若字段被重命名,直接替换为新的常量名;
- 若字段被移除,删除相关引用逻辑,改用Keycloak 22.x提供的安全配置API实现相同功能。
- 基于Keycloak 22.x依赖重新编译打包jar包。
- 拉取第三方监听器源码,搜索所有引用
修正pom依赖范围避免冲突
在监听器的pom.xml中,将所有Keycloak相关依赖的scope设为provided,防止打包时把旧版本Keycloak核心类打进jar包,与Keycloak 22.x内置类冲突:<dependencies> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-core</artifactId> <version>22.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-server-spi</artifactId> <version>22.0.0</version> <scope>provided</scope> </dependency> <!-- 其他Keycloak相关依赖同理设置 --> </dependencies>执行
mvn clean package重新打包,确保jar包仅包含监听器自身代码。改用Keycloak内置HTTP事件监听器
Keycloak 19及以上版本已内置HTTP事件监听器SPI,无需依赖第三方jar。直接在启动命令中启用并配置即可:/opt/keycloak/bin/kc.sh start --proxy=edge --hostname-strict=false --db-username=${DB_USERNAME} --db-password=${DB_PASSWORD} --spi-events-listener-http-enabled=true --spi-events-listener-http-server-uri=https://authserver.com/api/endpoint该内置监听器功能与第三方版本一致,且完全兼容Keycloak 22.x。
临时降级到Keycloak 21.x版本
如果暂时无法修改第三方监听器,可以先将镜像版本切换到quay.io/keycloak/keycloak:21.1.2,该版本仍保留FIPS字段,能正常兼容旧监听器jar,等完成监听器适配后再升级到22.x。
内容的提问来源于stack exchange,提问作者MJ95
相关产品推荐
相关产品推荐

