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