spring-boot - 如何将 Flux all 应用于返回 Mono<Boolean> 的谓词?

标签 spring-boot kotlin project-reactor

我的 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处的所有过滤器来过滤我的对象部分,以及 做最后flatMap仅当所有过滤器返回 true 时,停止过滤并发出 empty如果其中一个过滤器失败

最佳答案

您可以使用filterWhen()all() 结合使用的语句,例如(在 Java 代码中):

.filterWhen(userDetails -> Flux
    .fromIterable(securityFilters)
    .flatMap(securityFilter -> securityFilter.doFilter(userDetails))
    .all(result -> result))

我不认为有 all()接受 Mono<Boolean> 的语句不过,只有 Predicate<Boolean> ,所以这意味着你必须在最后写一个“奇怪”的语句 result -> result .

关于spring-boot - 如何将 Flux all 应用于返回 Mono<Boolean> 的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54651394/

相关文章:

java - Spring 启动安全 : Exception handling with custom authentication filters

java - 如何将所有日志输出写入文件spring boot

java - Spring boot jar打包和com4j

project-reactor - 具有短路选项的 Flux.concatDelayError

java - MongoDB + HibernateOGM + Spring Boot 自动创建数据库

android - 如何使用 navGraph 范围初始化 viewModel

android - 如何在 Compose 中构建以下布局?

android - Dagger2 不生成 Dagger 类

java - 将多个 Mono<List<Item>> 合并为一个

spring - 如何使用 WebClient 限制请求/秒?