На моей голове,
- контейнер сервлета не помечает запрос как безопасный и устанавливает
HttpServletRequest.getScheme
для возврата правильного значения
- Другой фильтр перехватывает запрос
Вы можете вставить фильтр в начале цепочки фильтров для проверки значения HttpServletRequest.getScheme
при поступлении запроса. Это то, что Spring Security использует для оценки.
Если веб-контейнер (tomcat / jetty) неправильно настраивает схему в HttpServletRequest, то это проблема конфигурации контейнера.
Я создал несколько сэмплов, с которыми можно поиграть
Я хочу, чтобы вы обратили особое внимание на тест , который может проходить в вашем случае
git clone https://github.com/fhanik/spring-security-community.git
cd spring-security-community
./gradlew :spring-security-community-samples-requires-secure-with-redirect:bootRun
Тесты в этом примере показывают рабочий пример и опускают зависимость от веб-сервера
Рабочая конфигурация может выглядеть следующим образом:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
//application security
.authorizeRequests()
.mvcMatchers("/non-secure/**").permitAll()
.anyRequest().hasRole("USER")
.and()
.formLogin()
.and()
.requiresChannel().anyRequest().requiresSecure()
.and()
.portMapper().http(8080).mapsTo(8081)
;
// @formatter:on
}
}
Я также создал интеграционные тесты , которые проверяют эту конфигурацию.