Как настроить Spring Security для возврата 401, а не страницы входа в систему

#java #spring #spring-security

Вопрос:

У меня есть такая конфигурация безопасности Spring, как эта:

 @Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http.cors().and().csrf().disable()
            .authorizeRequests()
            .antMatchers("/**").hasAuthority("Business_User")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginProcessingUrl("/login")
            .usernameParameter("username")
            .passwordParameter("password");
    http.headers().frameOptions().disable();
}
 

Аутентификация работает нормально. Однако, если аутентификация не удалась из-за неверного пользователя или неправильного пароля, возвращается стандартная страница входа в систему Spring с кодом возврата 200.

Это не то, чего я ожидал.

Как я могу настроить Spring Security для возврата 401 и пустого тела ответа, если пользователь не вошел в систему?

Комментарии:

1. Похоже, вы не хотите использовать форму входа в систему. Вы можете удалить .formLogin() и вместо этого добавить .httpBasic() или другую стратегию аутентификации, которую вы предпочитаете.

Ответ №1:

Вы можете сделать это, если проверка подлинности не удалась, служба безопасности spring обработает это, перенаправив вас на страницу входа в систему, но вы можете управлять этим, добавив следующий код:

     http
       .exceptionHandling()
       .authenticationEntryPoint(new org.springframework.boot.autoconfigure.security.Http401AuthenticationEntryPoint("headerValue"));
 

или

вы также можете использовать HttpStatusEntryPoint следующим образом

    http
      .exceptionHandling()
      .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))