Я использую Elastic Beanstalk для развертывания веб-сервера Spring Boot, работающего за балансировщиком нагрузки приложения (Elastic Load Balancer). Бизнес-правило заключается в том, что с этим веб-сервером следует связываться только через HTTPS. Поэтому любой HTTP-запрос сначала должен быть перенаправлен на HTTPS.
Основываясь на этой статье от Amazon, я должен просто проверить заголовки x-forwarded-for
и x-forwarded-proto
, которые устанавливаются балансировщиком нагрузки. Эти заголовки содержат информацию об исходном запросе, выполненном клиентом для балансировщика нагрузки.
Поэтому я начал искать встроенные способы для Spring Boot (я использую встроенный Tomcat-сервер, кстати) для проверки этих двух заголовков и перенаправления без необходимости писать слишком много кода самостоятельно. Spring Boot (мы находимся на версии 1.4) docs заявляет, чтобы использовать следующие свойства приложения:
security.require_ssl=true
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
Тестирование этого с Почтальоном дает мне HTTP 200, где я должен получить перенаправление 301/302. Я подозреваю, что это из-за того, что я использую Spring Security. Чтобы это работало с Spring Security, я мог бы добавить это к своему WebSecurityConfigurerAdapter
:
http.requiresChannel().anyRequest().requiresSecure();
Но теперь мои заголовки игнорируются и все запросы перенаправляются в HTTPS, даже если исходный запрос уже был HTTPS . Так что теперь ничего не работает.
Ответ Родриго Кесады здесь , кажется, то, что мне нужно, но он по-прежнему не уважает мои заголовки, по некоторым причинам. Этот запрос все еще дает мне перенаправление вместо 200:
GET / HTTP/1.1
Host: localhost:8080
X-Forwarded-Proto: https
X-Forwarded-For: 192.168.0.30
Существует множество других решений здесь и на других веб-сайтах, использующих другой промежуточный веб-сервер или настраивающих NGINX или Apache на AWS для выполнения перенаправления. Но я уже использую Tomcat, зачем мне настраивать еще один веб-сервер.
Так как я могу на самом деле настроить Spring Boot / Tomcat / Spring Security в Spring-way, чтобы сделать это перенаправление? Есть ли способ расширить поведение функции requiresSecure()
, чтобы она учитывала заголовки моих запросов? Или, что еще лучше, есть ли у Spring Security альтернативы свойствам приложений, которые я пробовал?