首页 > 解决方案 > 相当于 Micronaut 中的 javax.ws.rs NameBinding?

问题描述

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

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

我尝试的另一个技巧是尝试通过请求/链通过反射派生目标方法,但似乎目标方法保存在一个@Internal类中,这让我相信我不应该从过滤器中反映方法。如果我能够从过滤器中反映目标方法,我可以查找我的旧注释并对其进行过滤。

一般来说,是否有任何指导原则可以为除少数控制器/方法之外的大部分控制器/方法提供过滤器,例如逆过滤器模式(尽管这也不理想)?

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

标签: javajava-11micronaut

解决方案


如果您需要对端点进行细粒度控制,我会选择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 安全提供了它自己的 @Secured注释。


推荐阅读