【发布时间】:2021-08-04 23:47:56
【问题描述】:
我有一个响应式 Spring Boot 应用程序,其中我有不同的控制器,并且所有控制器都有 get、post、put、delete 方法 GET 和 DELETE 方法 URI 格式 => /{userName}/{others} 并确保 put 和 post 方法在其请求正文中必须具有字段 userid。 还有所有具有授权标头的请求。
而且我已经有一个名为 validate 的方法,它接受 2 个参数 authorizationHeader 和 userName,如果此映射存在则返回 true,否则返回 false。
我正在尝试编写通用过滤器,可以过滤传入的请求并在进入控制器之前进行验证。
如何编写这个通用的网络过滤器,尤其是如何从发布请求中提取正文并验证请求。
我试着写这个
@Component
@Slf4j
public class ExampleWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
ObjectMapper mapper = new ObjectMapper();
return serverWebExchange
.getRequest()
.getBody()
.next()
.flatMap(body -> {
try {
return validate(body, serverWebExchange
.geHeaders().get(0))
} catch (IOException e) {
return Mono.error(e);
}
})
.flatMap((boolean s) -> {
return webFilterChain.filter(serverWebExchange);
});
}
Mono<Boolean> validate(DataBuffer body, String Header){
//my logic to validate
}
}
但似乎在执行此过滤器方法后它挂起。所以我的问题是
- 如何编写能够读取正文并进行验证的 webfilter?
- 在 spring-boot 中是否有针对此类问题的其他通用解决方案?
【问题讨论】:
-
为了在 Spring Boot 中实现 JWT 身份验证,我通常使用 Spring Security:javainuse.com/spring/boot-jwt
-
授权头会有什么样的值,是JWT吗?
-
是的,它是 JWT @MidhunMohan
-
那么只是一个建议,而不是使用 req 正文中的 userId,我们是否应该在 jwt 上有一个 uid->userid 声明并在它有效时使用它。在这种情况下,您只需要访问标题并执行必要的操作。但如果 API 中预期的用户 id 不是令牌所有者的 id,这将不起作用
标签: java spring spring-boot spring-mvc spring-security