如何向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,需确保以下配置:
- 项目添加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>
- 在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
相关产品推荐
相关产品推荐

