问题描述
我正在努力将旧的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
注释。