java - 上下文注入(inject)的 SecurityContext 为 null

标签 java dependency-injection jax-rs resteasy security-context

我使用 JAX-RS 2.0 和 JPA 创建了一个 Javae EE 应用程序。我创建了一个用户实体的特殊提供程序(使用限定符)来提供当前用户(已登录)作为应用程序用户数据库中的实体。 为了获取当前用户,我使用

@Context
private SecurityContext secContext;

问题是这是空的。安全性设置良好(Wildfly 8.2) - 应用程序要求身份验证(基本),但 SecurityContext 为空。这是代码:

@RequestScoped
public class CurrentUserProducer implements Serializable {

    /**
     * Default
     */
    private static final long serialVersionUID = 1L;

    @Context
    private SecurityContext secContext;

    /**
     * Tries to find logged in user in user db (by name) and returns it. If not
     * found a new user with role {@link UserRole#USER} is created.
     * 
     * @return found user a new user with role user
     */
    @Produces
    @CurrentUser
    public User getCurrentUser() {
        if (secContext == null) {
            throw new IllegalStateException("Can't inject security context - security context is null.");
        //... code to retrieve or create new user
        return user;
    }

}

如您所见,我检查 secContext 是否为 null,当我尝试访问注入(inject) @CurrentUser 的资源时,我立即看到了异常。

那么如何解决这个问题呢?为什么 SecurityContext 为空。

最佳答案

正如我的评论中所述

SecurityContext is a JAX-RS component and can only be injected into other JAX-RS component. All you have is a CDI bean. You can try to make it an EJB and inject SessionContext. See Securing an Enterprise Bean Programmatically

尚未测试,但似乎适用于 OP。这是一个EE堆栈解决方案。

允许注入(inject)的另一种 JAX-RS(Resteasy 特定)方法是借助 ResteasyProviderFactory (在 this answer 的帮助下找到)。您可以在 ContainerRequestFilter 中使用它,它可以访问 SecurityContext。我们可以使用 RESTeasy 实用程序类将 User 推送到上下文中。这允许使用 @Context 注释进行注入(inject)。但不确定它如何/是否可以与自定义注释一起使用。这是一个例子

@Provider
public class UserContextFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext context) throws IOException {
        SecurityContext securityContext = context.getSecurityContext();
        String username = securityContext.getUserPrincipal().getName();

        ResteasyProviderFactory.pushContext(User.class, new User(username));
    }  
}

注意:这是一个 JAX-RS 2.0 解决方案(即 RESTeasy 3.x.x)。 2.0之前,没有ContainerRequestFilter

关于java - 上下文注入(inject)的 SecurityContext 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599495/

相关文章:

java - 分配日历值的问题

dependency-injection - 在 .NET Core 中无需配置即可自动解析具体类?

java - JAX-RS 响应不符合预期

java - 在 ClientRequestFilter 中附加查询参数

java - 如何通过单击链接来调用 REST Web 服务

java - 如何清除android中的后台进程?

java - java中的SPARQL查询REGEX边界返回空

java - Java中数组从小到大排序

java - 在我的测试中如何从 Spring Cloud Stream 获取 channel 对象

.net - 将数据注入(inject) WCF 服务