我正在将一个旧的超文本传输协议服务器移植到Micronaut,并且我被卡住了,试图将一个使用javax.ws.rs NameBinding注释的授权过滤器移植到一个Micronaut HTTP服务器过滤器。我的90%的端点/控制器使用我拥有的NameBinding注释,因此使用标准的Micronaut HTTP服务器筛选器将很困难。
一个臭气熏天的代码是创建一个接受所有api端点的过滤器(即.@Filter("/**")),然后可能存储所有不需要授权的路径的列表,并将其与请求的路径进行比较。
我尝试的另一个技巧是尝试通过请求/链派生带有反射的目标方法,但目标方法似乎保存在一个@Internal类中,这让我相信我不应该从过滤器中反射该方法。如果我能够从过滤器中反映目标方法,我就可以查找我的旧注释并对其进行过滤。
一般来说,是否有任何指导原则来为除少数控制器/方法之外的大量控制器/方法提供过滤器,例如反向过滤器模式(尽管这也不是理想的)?
在micronaut中有没有办法手动控制过滤器的注入?
发布于 2020-09-13 23:52:06
如果您需要对端点进行细粒度控制,我将使用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注释。
https://stackoverflow.com/questions/63840896
复制相似问题