Spring security, разрешить только https-соединение и отправить ошибку в противном случае

#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 указан в пути к классу), и предоставить его вашей точке входа.