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

如何向CDI @Named Bean中注入安全上下文?

自定义安全上下文访问方案

需求与现有实现

需要执行自定义验证(例如动态角色名验证),因此需要访问安全上下文。通常通过以下代码注入SessionContext:

@Resource
javax.ejb.SessionContext context;

但该注入方式仅在EJB Bean中生效,因此当前采用的方案是:创建一个@Stateless Bean封装SessionContext,再将该无状态Bean注入到@Named Bean中,以此间接访问安全上下文。

尝试过使用@Inject javax.security.enterprise.SecurityContext注入安全上下文,但完全无效,希望获取其他可行实现方案。

运行环境

  • Wildfly 24
  • Java SE 11

替代方案推荐

方案1:通过HttpServletRequest直接获取安全信息

在@Named Bean中注入HttpServletRequest,利用其API完成角色验证:

@Inject
private HttpServletRequest request;

// 动态验证角色
public boolean hasDynamicRole(String roleName) {
    return request.isUserInRole(roleName);
}

方案2:完善Java EE SecurityContext配置

若要使用javax.security.enterprise.SecurityContext,需确保以下配置:

  1. 项目添加Java EE 8 Security API依赖(若使用Maven):
<dependency>
    <groupId>javax.security.enterprise</groupId>
    <artifactId>javax.security.enterprise-api</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>
  1. 在Wildfly中启用安全模块,并配置身份验证机制(例如通过web.xml或@BasicAuthenticationMechanismDefinition注解),确保SecurityContext能被CDI容器正确识别并注入。

方案3:自定义CDI Producer提供SessionContext

创建EJB作为CDI生产者,将SessionContext暴露为CDI Bean,供@Named Bean直接注入:

@Stateless
public class SessionContextProducer {
    @Resource
    private SessionContext sessionContext;

    @Produces
    @ApplicationScoped
    public SessionContext getSessionContext() {
        return sessionContext;
    }
}

在@Named Bean中直接注入使用:

@Inject
private SessionContext sessionContext;

public boolean checkDynamicRole(String role) {
    return sessionContext.isCallerInRole(role);
}

内容的提问来源于stack exchange,提问作者Claudio Weiler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:40:28