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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:42:16