Как я могу вернуть ResponseEntity <> (HttpStatus.UNAUTHORIZED), когда аутентификация не удалась в базовой аутентификации безопасности Spring? - PullRequest
0 голосов
/ 04 июня 2019

Я использую базовую аутентификацию Spring Security в своем микро-сервисе для аутентификации клиента, и я предоставил потребителю, что я верну ответ как ResponseEntity <> (HttpStatus.XXX).Я могу добиться этого с помощью контроллера остатка для всех других кодов, кроме 401 (UNAUTHORIZED), поскольку фильтр BasicAuthenticationEntryPoint обрабатывает это и выдает ответ, когда в заголовке запроса нет сведений об авторизации.Как я могу вернуть ответ как ResponseEntity <> (HttpStatus.UNAUTHORIZED) в этом сценарии?

Я расширил BasicAuthenticationEntryPoint, чтобы настроить собственную точку входа аутентификации как MyBasicAuthenticationEntryPoint.Затем выдал исключение и попытался обработать из @ExceptionHandler.Но это не работает.Кроме того, я аннотировал класс с помощью @ControllerAdvice и прочитал, что он будет обрабатывать исключения, генерируемые только из контроллеров.И @ExceptionHandler будет обрабатывать исключения после DispatcherServlet, тогда как в моем случае запрос не достиг контроллера, так как в заголовке запроса отсутствуют данные авторизации.

Все, что я могу сделать, это включить заголовок моего ответа и ответстатус в HttpServletResponse.Мне интересно, будет ли это обрабатываться клиентом, когда он пытается ожидать тип возвращаемого значения как ResponseEntity <> (HttpStatus.XXX).

Определил мою собственную точку входа аутентификации в методе конфигурации расширенного класса WebSecurityConfigurerAdapter.

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().
                authorizeRequests()
                .antMatchers(HttpMethod.POST)
                .authenticated()
                .antMatchers("/api-docs",  "/swagger*/**")
                .permitAll()
                .and()

.httpBasic().authenticationEntryPoint(authenticationEntryPoint)
                ;


        http.headers().frameOptions().disable();
    }
}

Создал мою собственную точку входа для аутентификации следующим образом:

@Component
public class MyBasicAuthenticationEntryPoint extends 
BasicAuthenticationEntryPoint {

    @Override
    public void commence
      (HttpServletRequest request, HttpServletResponse response, 
AuthenticationException authEx) 
      throws IOException, ServletException {
        System.out.println("Child Class");
        throw new UnauthorizedException("unauthorized");
        //response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}

Определил класс UnauthorizedException путем расширения класса RuntimeException.

public class UnauthorizedException  extends RuntimeException {
 public UnauthorizedException(String message) {
 super(message);
 }
}

Обработано указанное выше исключение вResponseEntityExceptionHandler расширил класс следующим образом:

@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler {
  @ExceptionHandler(UnauthorizedException.class)
  public final ResponseEntity<Void> 
handleNotFoundException(UnauthorizedException ex, WebRequest request) {
      System.out.println("handling 401");
      return new ResponseEntity<>((HttpStatus.UNAUTHORIZED));
 }
}

Я ожидаю возврата ResponseEntity <> (HttpStatus.UNAUTHORIZED), но MyBasicAuthenticationEntryPoint записывает ответ с использованием response.setStatus (HttpServletResponUT.OR *A.HED). EN.

1 Ответ

0 голосов
/ 04 июня 2019

CustomizedResponseEntityExceptionHandler обрабатывает только исключения, встречающиеся в ваших контроллерах, этот @ControllerAdvice не требует пояснений.

Вы неправильно настроили свою authEntryPoint, обратитесь к этому ответу , чтобы увидеть, как вы можете настроить его правильно.

чтобы достичь того, что вы хотите, вы можете написать прямо на response в MyBasicAuthenticationEntryPoint.commence

...