#rest #redirect #spring-security #https
#rest #перенаправление #spring-безопасность #https
Вопрос:
у меня есть некоторые службы REST, и, как требование, вызывающей стороне разрешено вызывать их только по https: при каждой попытке использования http запрос должен быть отклонен путем отправки обратно настроенного ответа об ошибке json. В spring security я не знаю, как реализовать это поведение…единственное, что я смог сделать, это включить эту конфигурацию:
.and().requiresChannel().anyRequest().requiresSecure()
но результатом стало непрозрачное перенаправление, которое, несмотря на приемлемое и, возможно, «правильное», не соответствует требованию.
Есть идеи? Заранее спасибо!
Ответ №1:
По умолчанию, ChannelProcessor
который обрабатывает ваш запрос, является SecureChannelProcessor
, и он использует RetryWithHttpsEntryPoint
, который выполняет перенаправление. Вместо этого укажите свою собственную точку входа в процессор по умолчанию:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//...
http.requiresChannel().anyRequest().requiresSecure()
.channelProcessors(
Arrays.asList(mySecureChannelProcessor())
);
}
}
@Bean
public ChannelProcessor mySecureChannelProcessor() {
SecureChannelProcessor defaultProcessor = new SecureChannelProcessor();
defaultProcessor.setEntryPoint(new SendHttpsError());
return defaultProcessor;
}
}
public class SendHttpsError implements ChannelEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response) {
// send error
}
}
Если вы используете Spring Boot, вы можете @Autowire
использовать ObjectMapper
экземпляр, созданный по умолчанию (если Jackson указан в пути к классу), и предоставить его вашей точке входа.