Вы отключили все механизмы аутентификации, следовательно, ваш менеджер аутентификации ничего не вызывает. Как вы упомянули, вы можете реализовать аутентификацию через фильтры.
Пример реализации фильтра аутентификации:
@Bean
public AuthenticationWebFilter webFilter() {
AuthenticationWebFilter authenticationWebFilter = new AuthenticationWebFilter(authenticationManager);
authenticationWebFilter.setServerAuthenticationConverter(tokenAuthenticationConverter());
authenticationWebFilter.setRequiresAuthenticationMatcher(serverWebExchangeMatcher());
authenticationWebFilter.setSecurityContextRepository(NoOpServerSecurityContextRepository.getInstance());
return authenticationWebFilter;
}
Затем добавьте этот фильтр в ServerHttpSecurity: http.addFilterBefore(webFilter(),SecurityWebFiltersOrder.HTTP_BASIC)
Затем, наконец, будет вызван ваш менеджер аутентификации.
Вы должны предоставить несколько дополнительных вещей, чтобы заставить его работать.
Сопоставитель, чтобы проверить, добавлен ли заголовок Authorization
к запросу:
@Bean
public ServerWebExchangeMatcher serverWebExchangeMatcher() {
return exchange -> {
Mono<ServerHttpRequest> request = Mono.just(exchange).map(ServerWebExchange::getRequest);
return request.map(ServerHttpRequest::getHeaders)
.filter(h -> h.containsKey(HttpHeaders.AUTHORIZATION))
.flatMap($ -> ServerWebExchangeMatcher.MatchResult.match())
.switchIfEmpty(ServerWebExchangeMatcher.MatchResult.notMatch());
};
}
Преобразователь токенов, ответственный за получение токен из запроса и подготовка basi c AbstractAuthenticationToken
@Bean
public ServerAuthenticationConverter tokenAuthenticationConverter() {
return exchange -> Mono.justOrEmpty(exchange)
.map(e -> getTokenFromRequest(e))
.filter(token -> !StringUtils.isEmpty(token))
.map(token -> getAuthentication(token));
}
Я намеренно пропустил реализацию getTokenFromRequest
и getAuthentication
, потому что существует множество доступных примеров.