首页 > 解决方案 > Quarkus - 覆盖 SecurityContext 不适用于 quarkus-resteasy-reactive,但适用于 quarkus-resteasy

问题描述

我使用 AWS cognito 来获取 JWT 令牌。我有以下代码用我自己的代码覆盖 quarkus ContainerRequestContext 的安全上下文以及来自 Cognito 的附加属性

@PreMatching
public class SecurityFilter implements ContainerRequestFilter {

@Inject
    AuthenticationContextImpl authCtx;

    @Override
    public void filter(ContainerRequestContext requestContext) {
        String authHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);

        AUser user = new AUser(xxxxx);
        requestContext.setSecurityContext(new SecurityContext() {
            @Override
            public Principal getUserPrincipal() {
                return new Principal() {
                    @Override
                    public String getName() {
                        return user.getName();
                    }
                };
            }

            @Override
            public boolean isUserInRole(String r) {
                return user.getGroups().contains(r);
            }

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

            @Override
            public String getAuthenticationScheme() {
                return "basic";
            }

            public XXXUser getUser(){
                return user;
            }

        });

    }

当我使用 quarkus-resteasy 依赖项时,这很好用

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy</artifactId>
    </dependency>

但是当我使用 quarkus-rest-easy-reactive 依赖项时抛出以下异常

2021-05-21 23:27:43,564 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-eventloop-thread-1) HTTP Request to /interests failed, error id: f5b561bd-c844-45cc-80b0-dbc4077409b9-1: javax.enterprise.inject.UnsatisfiedResolutionException: No bean found for required type [interface io.quarkus.security.identity.CurrentIdentityAssociation] and qualifiers [[]]
    at io.quarkus.arc.impl.InstanceImpl.bean(InstanceImpl.java:175)
    at io.quarkus.arc.impl.InstanceImpl.getInternal(InstanceImpl.java:196)
    at io.quarkus.arc.impl.InstanceImpl.get(InstanceImpl.java:93)
    at io.quarkus.resteasy.reactive.server.runtime.security.SecurityContextOverrideHandler.updateIdentity(SecurityContextOverrideHandler.java:46)
    at io.quarkus.resteasy.reactive.server.runtime.security.SecurityContextOverrideHandler.handle(SecurityContextOverrideHandler.java:41)
    at io.quarkus.resteasy.reactive.server.runtime.security.SecurityContextOverrideHandler.handle(SecurityContextOverrideHandler.java:25)

似乎,通过覆盖 SecurityContext,我破坏了一些东西,但不确定是什么。

编辑:经过进一步研究,我发现这很有用:https ://quarkus.io/guides/security-built-in-authentication#proactive-authentication

请注意,如果使用主动身份验证,则访问 SecurityIdentity 是一个阻塞操作。这是因为身份验证可能尚未发生,访问它可能需要调用外部系统,例如可能阻塞的数据库。对于阻塞应用程序,这没有问题,但是如果您在反应式应用程序中禁用了身份验证,这将失败(因为您无法在 IO 线程上执行阻塞操作)。要解决这个问题,您需要@Inject io.quarkus.security.identity.CurrentIdentityAssociation 的一个实例,并调用 Uni getDeferredIdentity(); 方法。然后,您可以订阅生成的 Uni,并在身份验证完成且身份可用时收到通知。

不太确定这是如何工作的。我是否在过滤器的资源中注入 CurrentIdentityAssociation?在 Uni 解决之前我该怎么做?

标签: quarkus

解决方案


推荐阅读