【问题标题】:Equivalent of javax.ws.rs NameBinding in Micronaut?相当于 Micronaut 中的 javax.ws.rs NameBinding?
【发布时间】:2020-09-11 04:42:45
【问题描述】:

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

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

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

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

micronaut 有没有办法手动控制过滤器的注入?

【问题讨论】:

    标签: java java-11 micronaut


    【解决方案1】:

    如果您需要对端点进行细粒度控制,我会选择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 注释。

    【讨论】:

    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2013-06-11
    • 2013-07-18
    • 2018-10-05
    • 2011-11-08
    • 2021-09-14
    相关资源
    最近更新 更多