Попытка настроить неудачный вход в систему с помощью Spring Security - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь добавить дополнительную информацию в ответ на ошибку входа в систему от Spring Security.

Вот моя конфигурация:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private final CustomAuthenticationProvider authProvider;
    private final CustomAuthEntryPoint customAuthEntryPoint;

    public SecurityConfig(CustomAuthenticationProvider authProvider, CustomAuthEntryPoint customAuthEntryPoint) {
        this.authProvider = authProvider;
        this.customAuthEntryPoint = customAuthEntryPoint;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider);
    }

   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().and()
            .logout().deleteCookies("SESSION").and()
            .authorizeRequests()
                .antMatchers("/actuator/**").permitAll()
                .anyRequest().authenticated().and()         
            .httpBasic().authenticationEntryPoint(customAuthEntryPoint).and()
            .csrf().disable();
    }
}
@Component
public class CustomAuthEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        System.out.println("entrypoint " + exception.getClass().getName());
        response.getOutputStream().print(exception.getClass().getName());
        response.sendError(401, exception.getClass().getName());
    }
}

Когда я пытаюсь войти, он идетпервый раз в пользовательской точке входа с хорошим исключением (BadCredentialsException), но затем я думаю, что Spring пытается запросить к /error, а затем он возвращается в точку входа с InsufficientAuthenticationException (из ExceptionTranslationFilter.sendStartAuthentication).

И в ответе у меня есть 401 без какого-либо тела, даже имя класса исключения, как определено в точке входа.

Есть идеи, что не так с конфигурацией?

1 Ответ

0 голосов
/ 21 сентября 2019

Вы правы, Spring пытается перенаправить на "/ error", потому что вы вызвали response.sendError в вашем CustomAuthEntryPoint и попытаетесь снова аутентифицироваться, таким образом, вы получите еще одно исключение InsufficentAuthentication.Одним из способов решения этой проблемы является использование response.setStatus (401) вместо response.sendError .Например:

@Component
public class CustomAuthEntryPoint implements AuthenticationEntryPoint {
  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response,
      AuthenticationException exception) throws IOException, ServletException {
    System.out.println("entrypoint " + exception.getClass().getName());
    response.getOutputStream().print(exception.getClass().getName());
    response.setStatus(401);
  }
}

В качестве альтернативы вы можете исключить URL-адрес «/ error» из авторизации, но вы должны быть осторожны, чтобы не потерять конфиденциальную информацию в этой конечной точке ошибки:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().and()
            .logout().deleteCookies("SESSION").and()
            .authorizeRequests()
                .antMatchers("/actuator/**","/error").permitAll()
                .anyRequest().authenticated().and()         
            .httpBasic().authenticationEntryPoint(customAuthEntryPoint).and()
            .csrf().disable();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...