java - 如何在 Quarkus 应用程序中检索 SecurityContext?

标签 java security jax-rs quarkus

我有一个 Quarkus 应用程序,我在其中实现了 ContainerRequestFilter 接口(interface)来保存来自传入请求的 header :

@PreMatching
public class SecurityFilter implements ContainerRequestFilter {
   private static final String HEADER_EMAIL = "HD-Email";

   @Override
   public void filter(ContainerRequestContext requestContext) throws IOException {
       String email = requestContext.getHeaders().getFirst(HEADER_EMAIL);

       if (email == null) {
           throw new AuthenticationFailedException("Email header is required");
       }

       requestContext.setSecurityContext(new SecurityContext() {
           @Override
           public Principal getUserPrincipal() {
               return () -> email;
           }

           @Override
           public boolean isUserInRole(String role) {
               return false;
           }

           @Override
           public boolean isSecure() {
               return false;
           }

           @Override
           public String getAuthenticationScheme() {
               return null;
           }
       });
   }
}

在用 ApplicationScoped 注释的类中,我注入(inject)了如下上下文:

@ApplicationScoped
public class ProjectService {
    @Context
    SecurityContext context;
    ...
}

问题在于 context 属性实际上从未被注入(inject),因为它始终为 null

我做错了什么?我应该怎么做才能在整个应用程序代码中检索 SecurityContext

最佳答案

我喜欢抽象这个问题,以便业务逻辑不依赖于特定于 JAX-RS 的构造。因此,我创建了一个类来描述我的用户,比如 User,以及另一个接口(interface) AuthenticationContext,它包含当前用户和我需要的任何其他与身份验证相关的信息,例如:

public interface AuthenticationContext {
    User getCurrentUser();
}

我创建了这个类的 RequestScoped 实现,它也有相关的 setter(s):

@RequestScoped
public class AuthenticationContextImpl implements AuthenticationContext {
    private User user;

    @Override
    public User getCurrentUser() {
        return user;
    }

    public void setCurrentUser(User user) {
        this.user = user;
    }
}

现在,我将这个 bean 和 JAX-RS SecurityContext 注入(inject)到过滤器中,它知道如何创建 User 并将其设置到我的应用程序特定的 AuthenticationContext:

@PreMatching
public class SecurityFilter implements ContainerRequestFilter {

    @Inject AuthenticationContextImpl authCtx; // Injecting the implementation,
                                               // not the interface!!!

    @Context SecurityContext securityCtx;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        User user = ...// translate the securityCtx into a User
        authCtx.setCurrentUser(user);
    }
}

然后,任何需要用户数据的业务 bean 都会注入(inject)与环境无关、特定于应用程序的 AuthenticationContext

关于java - 如何在 Quarkus 应用程序中检索 SecurityContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66695265/

相关文章:

java - Bouncy CaSTLe 提供程序在标准 java 中工作时抛出 NoSuchAlgorithmException

java - 如何在使用 XERCES 解析时打印文本文件中的解析错误

php - 如何加密和解密PHP字符串?

java - Spring 安全: Multiple HTTP Config not working

没有身份验证的 WCF 传输安全性

java - 查看 ExpectedConditions 类,尝试找到 onChange

java - int 对象到整数转换的问题

java - 为什么我不能调用这个简单的 Web 服务?

java - 当在 Content-Type 中指定字符集时,Jersey 和 @FormParam 不起作用

java - 我可以在同一个类的两个方法中使用@GET注释吗?