Wildfly26.1.1+Keycloak18 OIDC下EJB获取调用主体为匿名问题
问题根因
这是Wildfly 26.x系列elytron-oidc-client子系统的默认配置缺陷,和是否跨部署单元没有关系:OIDC认证流程走完后,已认证的安全上下文默认只绑定在Servlet层的HTTP请求链路中,没有自动关联到EJB容器使用的Elytron安全域,EJB层调用时拿不到认证身份,就会直接返回AnonymousPrincipal匿名主体。
修复步骤
按以下顺序补全配置即可解决:
- 先确认你应用使用的安全域名称,如果没有做过自定义安全域配置,elytron-oidc-client默认使用的安全域名是
oidc。如果你自定义过Elytron安全域,后续配置里的oidc全部替换成你实际使用的安全域名称即可 - 进入Wildfly CLI执行以下命令,给EJB子系统添加对应安全域的映射,打通Servlet到EJB的安全上下文传播链路:
/subsystem=ejb3/application-security-domain=oidc:add(security-domain=oidc,enable-jacc=false,integrated-jaspi=true)
- 检查WAR包内
WEB-INF/jboss-web.xml的配置,确保安全域引用和上述配置的名称完全匹配,参考配置如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-web> <security-domain>oidc</security-domain> </jboss-web>
- 检查
WEB-INF/web.xml中的认证方式配置,确认已经替换为OIDC,没有残留旧版Keycloak适配器的配置项:
<login-config> <auth-method>OIDC</auth-method> <realm-name>oidc</realm-name> </login-config>
- 所有配置修改完成后重启Wildfly服务,重新登录验证即可。此时在Stateless Bean中通过
@Resource注入SessionContext,调用getCallerPrincipal()就能拿到正确的已认证用户主体,EJB层的角色权限校验也会同步生效。
特殊情况处理
如果完成上述配置后仍存在匿名用户问题,大概率是26.1.1小版本的残留bug,可以临时在Servlet层拿到OidcSecurityContext后,通过本地EJB调用的上下文手动传递身份凭证,不过这个方案属于临时规避,优先使用上述标准配置方案。
内容的提问来源于stack exchange,提问作者Andrius
相关产品推荐
相关产品推荐

