Я использую базовую аутентификацию 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.