如何将Flux all应用于返回Mono <boolean>的谓词?

时间:2019-02-12 13:39:13

标签: 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部分的所有过滤器过滤我的对象,然后 仅在所有过滤器都返回true时才执行最后的flatMap,并在其中一个过滤器失败时停止过滤并发出empty

1 个答案:

答案 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>