Spring Security: требуется-канал= "https" за ускорителем SSL

мы используем устройство F5 BIG-IP для завершения SSL-соединений и подключения по простому HTTP к серверу приложений с приложением с поддержкой spring. Также мы настроили F5 для отправки заголовка X-Forwarded-Proto с http или https в качестве значения.

теперь мы хотели бы применить HTTPS, настроив url-адрес перехвата:

<security:intercept-url pattern="/login.action" requires-channel="https" />

но это работает только в том случае, если схема протокола в контейнере сервлетов-HTTPS, поэтому нам нужно интерпретировать HTTP заголовок.

есть идеи, как это сделать?

спасибо Саймон!--2-->

3 ответов


подкласс SecureChannelProcessor и InsecureChannelProcessor переопределение decide(). Вам нужно будет скопировать и вставить некоторый код, например, для Secure:

    @Override
    public void decide(FilterInvocation invocation, Collection<ConfigAttribute> config) throws IOException, ServletException {
      Assert.isTrue((invocation != null) && (config != null), 
                       "Nulls cannot be provided");

      for (ConfigAttribute attribute : config) {
          if (supports(attribute)) {
              if (invocation.getHttpRequest().
                      getHeader("X-Forwarded-Proto").equals("http")) {
                  entryPoint.commence(invocation.getRequest(),
                      invocation.getResponse());
              }
          }
      }
    }

затем установите эти ChannelProcessors на ChannelDecisionManagerImpl bean с помощью BeanPostProcessor.


Я знаю, что этому вопросу / ответу 4 года, но это помогает мне найти решение моей проблемы. Но в современных приложениях Spring Boot исправление проще. Просто добавьте следующую запись в ваш application.yaml:

server.tomcat.protocol_header: x-forwarded-proto

mor информация здесь: http://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https


теперь еще проще:

server.use-forward-headers: true

включено по умолчанию для Cloud Foundry и Heroku, но не для других, таких как AWS.

документация (раздел 73.7): https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto-embedded-servlet-containers.html