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

Equivalent of javax.ws.rs NameBinding in Micronaut?

我正在努力将旧的 HTTP 服务器移植到 Micronaut,但我一直在尝试将使用 javax.ws.rs NameBinding 注释的授权过滤器移植到 Micronaut HTTP 服务器过滤器。我的 endpoints/controllers 的 90% 使用我拥有的 NameBinding 注解,因此使用标准的 Micronaut HTTP 服务器过滤器会很困难。

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

我尝试的另一个 hack 是尝试通过 request/chain 的反射推导目标方法,但似乎目标方法保存在 @Internal class 中,这导致我相信我不应该反思过滤器的方法。如果我能够从过滤器中反映目标方法,我可以查找我的旧注释并对其进行过滤。

一般来说,是否有任何指导原则可以为 controllers/methods 的大子集提供过滤器,但不包括少数,例如反向过滤器模式(尽管这也不是理想的)?

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 注释。