gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:24:29 24 4
gpt4 key购买 nike

我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com