quarkus - 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 解决之前我该怎么做?
解决方案
推荐阅读
- javascript - 如何使用 JavaScript 清除文本框?
- c++ - 为什么我会收到使用 MPI 屏障 [c++] 的致命错误
- openshift - Openshift - S2I - 拉取失败 - 请求的资源访问被拒绝
- php - WP_REST_Request "set_query_params" - $_GET 为空
- sql - 如何在不同条件的sql server的case语句中插入多个else?
- php - Laravel - 编辑表单更新复选框值
- ruby-on-rails - 在 ActiveRecord 中覆盖继承的 after_save 函数
- python - 具有不同列数的树视图 GTK
- kubernetes-helm - 检查 Helm 中嵌套对象的存在
- python - Python 抓取问题“TypeError: can only concatenate str (not "ResultSet") to str”