Как я могу применить Flux all к предикату, который возвращает Mono <Boolean>? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть список фильтров для моего приложения 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, если один изфильтры не работают

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете использовать оператор filterWhen() в сочетании с all(), например (в коде Java):

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

Я не думаю, что есть оператор all(), который принимает Mono<Boolean> хотя, только Predicate<Boolean>, так что это означает, что вы должны написать «странный» оператор в конце, который делает result -> result.

...