我如何将 Flux all 应用于 returns Mono<Boolean> 的谓词?
How can I apply Flux all to a predicate that returns Mono<Boolean>?
我有一个用于我的 Spring 启动应用程序的过滤器列表,用于检查我的登录用户是否应该启用,过滤器 return Mono<Boolean>
现在我想要的是将我的对象传递给所有对象,并链接过滤器。但关键是,如果任何过滤器 returns 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
部分的所有过滤器过滤我的对象,并且
仅当所有过滤器 return 为真时才执行最终 flatMap
,如果其中一个过滤器失败
,则停止过滤并发出 empty
您可以将 filterWhen()
语句与 all()
结合使用,例如(在 Java 代码中):
.filterWhen(userDetails -> Flux
.fromIterable(securityFilters)
.flatMap(securityFilter -> securityFilter.doFilter(userDetails))
.all(result -> result))
我认为没有接受 Mono<Boolean>
的 all()
语句,只有 Predicate<Boolean>
,所以这意味着您必须编写 "weird" 语句最后 result -> result
.
我有一个用于我的 Spring 启动应用程序的过滤器列表,用于检查我的登录用户是否应该启用,过滤器 return Mono<Boolean>
现在我想要的是将我的对象传递给所有对象,并链接过滤器。但关键是,如果任何过滤器 returns 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
部分的所有过滤器过滤我的对象,并且
仅当所有过滤器 return 为真时才执行最终 flatMap
,如果其中一个过滤器失败
empty
您可以将 filterWhen()
语句与 all()
结合使用,例如(在 Java 代码中):
.filterWhen(userDetails -> Flux
.fromIterable(securityFilters)
.flatMap(securityFilter -> securityFilter.doFilter(userDetails))
.all(result -> result))
我认为没有接受 Mono<Boolean>
的 all()
语句,只有 Predicate<Boolean>
,所以这意味着您必须编写 "weird" 语句最后 result -> result
.