java - 相当于 Micronaut 中的 javax.ws.rs NameBinding?
问题描述
我正在将旧的 HTTP 服务器移植到 Micronaut,并且我一直在尝试将使用javax.ws.rs
NameBinding
注释的授权过滤器移植到 Micronaut HTTP 服务器过滤器。我的 90% 的端点/控制器使用NameBinding
我拥有的注释,因此使用标准的 Micronaut HTTP 服务器过滤器会很困难。
一个臭代码的想法是创建一个接受所有 api 端点(即。@Filter("/**")
)的过滤器,然后可能存储不需要授权的所有路径的列表,并将其与请求的路径进行比较。
我尝试的另一个技巧是尝试通过请求/链通过反射派生目标方法,但似乎目标方法保存在一个@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 安全提供了它自己的 @Secured
注释。
推荐阅读
- php - 在 Google 表格中更新单元格字体时保持边框
- arrays - ForEach 循环中的 SwiftUI 崩溃
- javascript - 在javascript中将数组转换为对象
- php - 表中 php/mysql 结果的限制(可能很容易)
- c - 结构指针的 C 类型转换
- kubernetes - 对于 k8s csi 插件——例如 topolvm,如何获取持久卷使用字节数
- javascript - 滚动javascript时如何使2个动作生效?
- laravel-8 - Laravel Sanctum 令牌()未定义
- java - 我想使用鼠标适配器获取 x 和 y 的坐标并插入到数组中。但是在整个数组中每次只有两个值得到更新
- angular - Angular 10 不发送套接字消息