Spring Security перенаправляет на локальный хост на производственном сервере - PullRequest
2 голосов
/ 07 октября 2010

У меня есть приложение grails с установленным плагином spring-security-core.Все отлично работает локально.Я развернул на промежуточный сервер, и все работало нормально.Я развернул на нашем производственном сервере, который является зеркалом нашего промежуточного сервера.Я могу попасть на незащищенные страницы просто отлично.Но когда Spring Security включается и пытается сделать это, он перенаправляет его на localhost вместо grails.serverURL.

Я собираюсь включить регистрацию настолько высоко, насколько это возможно, и заново развернуть, чтобы увидеть, могу ли я сделатьголовы или хвосты чего-либо.Я опубликую свою находку здесь.Если кто-то испытал это раньше и знает, что может происходить, пожалуйста, дайте мне знать.Кроме того, если есть какие-либо файлы конфигурации, которые необходимо просмотреть, я также могу предоставить их.Спасибо.

Обновление Я добавил следующее в конец Config.groovy

grails.plugins.springsecurity.useSecurityEventListener = true

grails.plugins.springsecurity.onAuthorizationEvent = { e, appCtx ->
   println "here"
   println e
}

Локально, это закрытие получает удар 2 раза при попытке доступа к защищенной странице,Один раз для начального URL.Второй раз для аутентификации URL.Развернул это на нашем производственном сервере, и я ничего не получил.

Ответы [ 4 ]

5 голосов
/ 24 апреля 2011

Если ваш сервер приложений находится за веб-сервером, эта проблема, вероятно, вызвана конфигурацией вашего веб-сервера.У меня была такая же проблема, и я исправил ее, используя следующую запись в моем httpd.conf или apache2.conf.Вот оно ...

... шаблонная конфигурация здесь ...

################################
# Begin yourdomain.com...      #
################################

ProxyRequests Off
ProxyPreserveHost On

<Proxy>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://localhost:28080/
ProxyPassReverse / http://localhost:28080/

<Location>
    Order allow,deny
    Allow from all
</Location>

################################
# ... end yourdomain.com       #
################################
5 голосов
/ 08 октября 2010

Перенаправления выполняются в методе org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint.commence() , поэтому вы можете установить точку останова, если вы можете одолжить один из серверов prod для отладки.

Он создаетURL перенаправления на основе формы входа в систему uri (например, / login / auth), но он использует request.getServerName(), поэтому он должен совпадать с исходным запросом.Обратите внимание, что grails.serverURL не оказывает здесь никакого влияния, поскольку он создает URL-адрес с использованием запрошенного имени сервера, порта, контекста и т. Д.

На это может повлиять размещение Apache или балансировщика нагрузки перед контейнером сервлета,хотя я сделал и то, и другое, и он работал нормально.

Делали ли вы какие-либо настройки бина в resources.groovy, которые могли бы повлиять на это?

2 голосов
/ 31 октября 2012

Если у вас есть веб-сервер (apache, nginx и т. Д.) В качестве прокси-сервера перед Tomcat (и вы используете Tomcat) ...

В настройках, где вы разрешаете http и https, добавьте отдельный элемент Connector в файл tomcat conf / server.xml:

<Connector port="8081" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"  URIEncoding="UTF-8"
           scheme="https" secure="true" proxyName="somehostname.domain" proxyPort="443" />

Если разрешен только https, вы можете добавить атрибуты схемы, secure, proxyName и proxyPort к существующему элементу Connector.

В конфигурации apache создайте прокси-сервер виртуального хоста *: 443 для Connector с дополнительными атрибутами. Простой http *: 80 можно подключить к исходному соединителю.

Для получения дополнительной информации: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Proxy_Support http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html

1 голос
/ 30 марта 2016

Я знаю, что это старый вопрос, но я хотел бы добавить свои выводы, чтобы помочь другим пользователям, которые могут столкнуться с этой проблемой.

В дополнение к ответу Берта (я предполагаю, что вы используете tomcat) я обнаружил, что возвращаемое значение request.getServerName () также может быть установлено через server.xml

т.е. в коте 8 https://tomcat.apache.org/tomcat-8.0-doc/config/http.html

с этой строкой в ​​server.xml

<Connector protocol="HTTP/1.1"
           port="8080" ...
proxyName="localhost"/>

вернет "localhost" при вызове getServername.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...