我有一个用于Spring Boot应用程序的过滤器列表,用于检查是否应启用我的登录用户,并且过滤器返回Mono<Boolean>
现在我想要的是将我的对象传递给所有对象,并链接过滤器。但是关键是,如果任何过滤器返回false
这是我的Filter
界面
interface Filter {
fun doFilter(obj: UserDetails): Mono<Boolean>
}
这是我登录方法的代码
private fun login(serverRequest: ServerRequest, securityFilters: List<SecurityFilter>): Mono<ServerResponse> {
return serverRequest
.bodyToMono(LoginPayload::class.java)
.flatMap {
userDetailsService.findByUsername(it.username)
.filter { userDetails -> passwordEncoder.matches(it.password, userDetails.password) }
}
./////////////////////////TODO///////////////////////
.flatMap {
val jwt = jwtService.generateJwtToken(it)
ServerResponse
.ok()
.cookie(ResponseCookie.from("jwt-access-token", jwt).build())
.build()
}
.switchIfEmpty(ServerResponse.status(HttpStatus.UNAUTHORIZED).build())
}
我想要的是用TODO
部分的所有过滤器过滤我的对象,然后
仅在所有过滤器都返回true时才执行最后的flatMap
,并在其中一个过滤器失败时停止过滤并发出empty
答案 0 :(得分:1)
例如,您可以将fab executeTask
语句与filterWhen()
结合使用(在Java代码中):
all()
我认为虽然没有.filterWhen(userDetails -> Flux
.fromIterable(securityFilters)
.flatMap(securityFilter -> securityFilter.doFilter(userDetails))
.all(result -> result))
语句接受all()
,而仅接受Mono<Boolean>
,所以这意味着您必须在末尾写一个“怪异”语句做Predicate<Boolean>
。