Надеюсь, это несколько полезно.
тоящее время, когда пользователь не проходит аутентификацию, Spring Security отвечает:
{"error": "invalid_grant","error_description": "Bad credentials"}
И я хотел бы улучшить этот ответ с помощью кода ответа, такого как:
{"responsecode": "XYZ","error": "invalid_grant","error_description": "Bad credentials"}
После некоторого возни, похоже, что мне нужно сделать, это реализовать AuthenticationFailureHandler, что я начал делать. Тем не менее, метод onAuthenticationFailure, кажется, никогда не достигается, когда я отправляю неверные учетные данные для входа. Я прошел через код и поместил регистрацию в методе onAuthenticationFailure, чтобы подтвердить, что он не достигнут.
Мой обработчик ошибок:
@Component
public class SSOAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler{
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
super.onAuthenticationFailure(request, response, exception);
response.addHeader("responsecode", "XYZ");
}
}
И мой WebSecurityConfigurerAdapter содержит:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired SSOAuthenticationFailureHandler authenticationFailureHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.formLogin().failureHandler(authenticationFailureHandler);
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(service).passwordEncoder(passwordEncoder());
auth.authenticationEventPublisher(defaultAuthenticationEventPublisher());
}
@Bean
public DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(){
return new DefaultAuthenticationEventPublisher();
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public SSOAuthenticationFailureHandler authenticationHandlerBean() {
return new SSOAuthenticationFailureHandler();
}
@Bean
public PasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
}
Мои вопросы:
Это правильный путь для достижения желаемого результата? (Настройка ответа аутентификации Spring Spring)Если да, то сделал ли я что-то не так, пытаясь настроить обработчик ошибок аутентификации (поскольку неправильный вход в систему, похоже, не достигает метода onAuthenticationFailure?Спасибо!