等价于Micronaut中的javax.ws.rs NameBinding?

问题描述

我正在努力将旧的HTTP服务器移植到Micronaut,并且一直试图将使用javax.ws.rs NameBinding批注的授权过滤器移植到Micronaut HTTP服务器过滤器。我90%的端点/控制器使用的是NameBinding注释,因此使用标准的Micronaut HTTP服务器过滤器将很困难。

一个臭名昭著的代码是想创建一个接受所有api端点(即@Filter("/**"))的过滤器,然后可能存储不需要授权的所有路径的列表,并将其与请求的路径进行比较。 / p>

我尝试的另一种方法是尝试通过请求/链通过反射派生目标方法,但似乎目标方法保存在@Internal类中,这使我认为我不应该进行反思过滤器中的方法。如果我能够从过滤器中反映出目标方法,则可以寻找我的旧注释并对此进行过滤。

总的来说,是否有任何指导原则可为除少数几个控制器/方法(例如反向滤波器模式)提供过滤器(尽管这也不理想)?

micronaut中有什么方法可以手动控制过滤器的注入吗?

解决方法

如果您需要对端点进行精细的控制,我会去micronaut AOP

@Documented
@Retention(RUNTIME)
@Target(ElementType.METHOD)
@Around
@Type(AuthenticatedInterceptor.class)
public @interface Authenticated {
}

和拦截器响应

@Singleton
public class AuthenticatedInterceptor implements MethodInterceptor<Object,Object> {

    @Override
    public Object intercept(MethodInvocationContext<Object,Object> context) {
        final var authHeader = ServerRequestContext.currentRequest()
                .map(HttpMessage::getHeaders)
                .flatMap(HttpHeaders::getAuthorization)
                .orElseThrow(() -> new RuntimeException("no header"));

        validate(authHeader);

        return context.proceed();
    }
}

然后,您必须在每个需要认证的方法上添加@Authenticated

更新

Micronaut安全性提供了own @Secured注释。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...