Keycloak 21.1.2执行JavaScript适配器时找不到ScriptEngine问题求助
问题描述
使用quay.io/keycloak/keycloak:21.1.2 Docker镜像搭配JavaScript适配器时,认证流程执行适配器出现如下错误:
keycloak-1 keycloak 2023-09-26 11:19:33,012 WARN
[org.keycloak.services] (executor-thread-5) KC-SERVICES0013: Failed
authentication: java.lang.IllegalStateException: Could not find
ScriptEngine for script: Script{id='null', realmId='master',
name='role-based-authenticator', type='text/javascript',
code='AuthenticationFlowError =
Java.type("org.keycloak.authentication.AuthenticationFlowError");
根据Keycloak 21.1.0版本发布说明,Nashorn JavaScript引擎默认已内置在Keycloak服务器中,但仍出现该问题,求解决方法。
更新 2023.10.05
用以下代码尝试复现问题,运行完全正常。推测问题出在复杂自定义构建中,但无法分享该构建细节。
docker-compose.yaml
version: "3.9" services: keycloak: build: context: . args: - KC_FEATURES=scripts environment: KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin KC_LOG_LEVEL: info KC_HOSTNAME_STRICT_HTTPS: "false" KC_FEATURES: scripts command: - start-dev ports: - 8080:8080
Dockerfile
ARG KEYCLOAK_VERSION=21.1.2 FROM redhat/ubi8-minimal:8.6-941 as bundle # Stage to avoid zip in final image and git repository RUN microdnf install -y findutils zip COPY keycloak-extensions /tmp/keycloak-extensions WORKDIR /tmp/keycloak-extensions RUN find . -maxdepth 1 -mindepth 1 -type d -execdir /bin/sh -c "cd {}; zip -r \"/tmp/keycloak-extensions/{}.jar\" ." \ # Build Step FROM quay.io/keycloak/keycloak:$KEYCLOAK_VERSION as builder ARG KC_FEATURES # Copy Keycloak extensions and metrics provider COPY --from=bundle /tmp/keycloak-extensions/*.jar /opt/keycloak/providers/ # Build optimized keycloak image RUN /opt/keycloak/bin/kc.sh build FROM quay.io/keycloak/keycloak:$KEYCLOAK_VERSION ARG KC_FEATURES COPY --from=builder /opt/keycloak/ /opt/keycloak/ EXPOSE 8080 ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] CMD [ "start"]
Keycloak适配器代码
keycloak-extensions/log-autenticator/log-authenticator.js
function authenticate(context) { LOG.info("Hello World!"); context.success(); }
keycloak-extensions/log-autenticator/META-INF/keycloak-scripts.json
{ "authenticators": [ { "name": "log-authenticator", "fileName": "log-authenticator.js", "description": "Logs a simple Hello message" } ] }
排查建议
既然基础复现环境正常,问题出在自定义复杂构建中,可从以下方向排查:
- 确认
scripts特性是否全局生效:检查构建全流程中KC_FEATURES参数是否在所有阶段正确传递,避免最终镜像中丢失该配置。启动时可查看日志,确认是否有scripts特性加载的相关记录。 - 检查构建依赖完整性:复杂构建的优化或打包环节可能误删Nashorn相关依赖。对比基础镜像与自定义镜像的依赖差异,确认
jdk.scripting.nashorn模块是否存在。 - 验证扩展打包规范:检查自定义脚本扩展的打包是否符合Keycloak要求,比如
keycloak-scripts.json的路径是否正确、脚本文件是否被完整包含在jar包内,避免路径错误导致脚本无法被识别。 - 核查构建命令参数:确认
kc.sh build命令未添加禁用脚本引擎的参数,也没有其他自定义配置覆盖默认的脚本引擎设置。 - 获取完整错误堆栈:收集更完整的错误日志信息,确认是引擎未找到,还是脚本执行时的其他依赖缺失,以此缩小问题范围。
内容的提问来源于stack exchange,提问作者Sirish Kumar Bethala
相关产品推荐
相关产品推荐

