Я пытаюсь настроить пользовательские строковые сообщения безопасности Spring webflux, если вход / выход был успешным или произошел сбой.Обработчики работают за исключением «authenticationFailureHandler».В документах упоминается что-то о logoutSuccessUrl (), но он не существует, и эти обработчики возвращаются с Mono .Поэтому у меня есть 2 вопроса:
Как мне вернуть некоторую строку в качестве ответа, например, если аутентификация не удалась, что-то вроде «Неверное имя пользователя или пароль», или какая-то строка json.Я пытался перенаправить на действие, но я не могу сделать это с void Mono.
Почему не работает authenticationFailureHandler, а любой другой обработчик работает?Это ошибка?
-Я пытался перенаправить с помощью Mono.just ("redirect: / some-url"). Then (), но ничего не сделал.Для ответов
- Я сделал свой обработчик bean, попытался изменить последовательность методов, отключив / включив другие обработчики.Для authenticationFailureHandler.
Вы можете найти весь мой код здесь: https://github.com/iron2414/WebFluxAuth Это модифицированная версия кода этой статьи: https://medium.com/@mgray_94552/reactive-authorization-in-spring-security-943e6534aaeb
Конфигурация безопасности выглядит следующим образомэто:
return http
.exceptionHandling()
.accessDeniedHandler((swe, e) -> {
System.out.println("ACCESS DENIED");
return Mono.fromRunnable(() -> {
swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
});
})
.authenticationEntryPoint((swe, e) -> {
System.out.println("AUTHENTICATION ENTRTY POINT");
ServerHttpResponse response = swe.getResponse();
return Mono.fromRunnable(() -> {
swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
});
})
.and()
.authorizeExchange()
.pathMatchers("/**").authenticated()
.and()
.formLogin()
.authenticationFailureHandler(MyAuthenticationFailureHandler())
.authenticationSuccessHandler(MyAuthenticationSuccessHandler()).and()
.logout().logoutSuccessHandler(MyLogoutHandler())
.and()
.csrf()
.disable()
.build();
Обработчик loginFailure:
@Bean
public MyAuthenticationFailureHandler MyAuthenticationFailureHandler() {
return new MyAuthenticationFailureHandler();
}
@Component
public class MyAuthenticationFailureHandler implements ServerAuthenticationFailureHandler {
@Override
public Mono<Void> onAuthenticationFailure(WebFilterExchange webFilterExchange, AuthenticationException e) {
//TODO redirect
System.out.println("AUTHENTICATION FAILURE");
return Mono.empty();
}
}