2012-04-30 2 views
31

У меня есть веб-приложение Spring, защищенное Spring Security, работающее на EC2. Перед экземпляром EC2 есть балансировщик эластичной нагрузки с сертификатом SSL (https завершается на балансировщике нагрузки, то есть порт 443 -> порт 80), поэтому с точки зрения Tomcat входящие запросы являются HTTP.Вход HTTPS с Spring Security перенаправляет на HTTP

Моя форма входа отправляется в https, однако последующая переадресация переходит на http (успех или сбой). Аутентификация прошла успешно, и я могу вернуться к протоколу HTTPS, и я вошел в

Моя конфигурация Войти выглядит так:.

<security:form-login 
    default-target-url="/home" 
    login-page="/" 
    login-processing-url="/processlogin" 
    authentication-failure-url="/?login_error=1"/> 

Что мне нужно сделать, чтобы изменить, чтобы сделать по умолчанию-целевой URL- и аутентификация-отказ-url идут к https?

  • Tomcat 6
  • Spring Security 3.0.x
+0

Я установил переписку Apache в среднем, но все еще любопытно, есть ли способ сделать это с помощью Spring Security config. – Thody

+0

обычно это делается при балансировке нагрузки, а конфигурация называется url-rewrite. Этот способ балансировки нагрузки гарантирует, что перенаправление остается на https. – Ritesh

ответ

1

Один из способов я получил эту работу, добавляя следующий конфиг

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" > 
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" /> 
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" /> 
    ... 
</http> 

пришлось добавить always-use-default-target="true" и default-target-url="https://....". Не идеальный способ, так как вам нужно жестко закодировать URL-адрес в конфиге.

0

Я установил require-channel = "any" на все перехваты-ссылки. Это позволяет ему по-прежнему работать в среде моего dev, где я не использую SSL.

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/> 
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/> 

Затем создайте виртуальный хост apache, который перенаправляет весь трафик на версию HTTPS.

<VirtualHost *:80> 
    ServerName www.mywebsite.com 
    Redirect permanent/https://www.mywebsite.com/ 
</VirtualHost> 
+5

После входа в систему Spring все равно отправит заголовок местоположения с http-адресом. Пользователь не заметит, потому что ваш apache мгновенно перенаправит его на https, но это по-прежнему серьезная проблема безопасности, потому что браузер отправит куки сессии по незащищенному каналу. – marcelj

+0

@marcelj - Я просто пробежал по Firebug, и вы правы. Я попытаюсь найти лучшее решение и пересмотреть свой ответ, если я это сделаю. –

+0

@marcelj, Не могли бы вы объяснить, почему это серьезный риск для безопасности или предоставить ссылку, описывающую риск? –

19

Ваша конфигурация пружины должна быть агностической для используемого протокола. Если вы используете что-то вроде «require-channel», рано или поздно вы столкнетесь с проблемами, особенно если вы хотите развернуть одно и то же приложение в среде разработки без https.

Вместо этого подумайте над тем, как правильно настроить ваш кота. Вы можете сделать это с помощью RemoteIpValve. В зависимости от заголовков loadbalancer посылает, конфигурация server.xml должна содержать что-то вроде этого:

<Valve 
    className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies=".*" 
    protocolHeader="X-Forwarded-Proto" 
    httpsServerPort="443" 
    /> 

весна будет определять абсолютный адрес перенаправления на основе ServletRequest, поэтому изменить httpsServerPort, если вы используете что-то другое, чем 443:

httpsServerPort это порт, возвращаемый ServletRequest.getServerPort(), когда protocolHeader указывает протокол HTTPS

0

Я также сталкиваюсь с такой же проблемой, и до тех пор, пока не получаю надлежащее решение, я перенаправляю свои запросы с прокси-сервера на сервер tomcat через AJP вместо HTTP. Ниже моя апач конфигурация

ProxyPass /myproject ajp://localhost:8009/myproject 
ProxyPassReverse /myproject ajp://localhost:8009/myproject 
0

использование ниже строк кода в Интернете.xml

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Login and Restricted Space URLs</web-resource-name> 
    <url-pattern>/j_security_check</url-pattern> 
    <url-pattern>/loginpage.rose</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

Это вынуждает использовать HTTPS.

Смежные вопросы