Обработчик ошибок входа в систему безопасности Webflux не работает - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь настроить пользовательские строковые сообщения безопасности 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();
    }
}

1 Ответ

0 голосов
/ 23 апреля 2019

Для ответа мне пришлось использовать «RedirectServerAuthenticationSuccessHandler» для успешной аутентификации. И я создал точно такой же класс, который реализует для сбоя.

Неработающий обработчик ошибок аутентификации - известная проблема. Для того, чтобы это работало, вам нужно настроить страницу входа. Поэтому я просто обновил его до значения по умолчанию "/ login"

...