Grails получает IP-адрес клиента при развертывании в облаке?
У меня есть приложение Grails, и я хочу заблокировать его с помощью ip, чтобы доступ к приложению имел только несколько диапазонов IP-адресов. Я использовал команду Spring Security в Config для достижения этой цели:
grails.plugins.springsecurity.ipRestrictions
Затем, когда я запускаю приложение в облаке (Jelastic), несмотря на то, что я нахожусь на одном из перечисленных IP-адресов, оно не позволяет мне получить доступ к нужным областям. Затем я помещаю некоторый код в приложение, показанное ниже, чтобы получить адрес Клиента, и он показывает адрес, возможно, облачного прокси-сервера вместо Клиента, использующего Приложение:
request.getRemoteAddr()
Я думаю, что он не позволит мне получить доступ к тем областям, которые я хочу, так как он считывает мой IP как IP-адрес облачного прокси-сервера. Я также попытался выполнить приведенные ниже команды, чтобы посмотреть, возвращает ли какая-либо из них мой фактический IP-адрес, однако все они были нулевыми:S
request.getHeader("X-Forwarded-For");
request.getHeader("Proxy-Client-IP");
request.getHeader("WL-Proxy-Client-IP")
request.getHeader("HTTP_CLIENT_IP")
request.getHeader("HTTP_X_FORWARDED_FOR")
Мне просто нужно знать, есть ли какой-нибудь способ ограничения этого приложения в облаке по IP-адресу клиента, а не по IP-адресу облачного прокси-сервера? заранее спасибо
4 ответа
Все запросы к экземплярам Jelastic поступают через инфраструктуру глобального Resolver.
Итак, вы правы, request.getRemoteAddr()
возвращает IP Resolver, и он не распознается вашим списком разрешенных.
Обходным путем для этого является покупка внешнего IP для вашего сервера приложений в Jelastic. В этом случае все запросы будут поступать непосредственно в ваш экземпляр.
Я также рекомендую вам войти в специальное сообщество Jelastic, чтобы поделиться своим опытом и получить помощь от других.
Вы пытались сбросить заголовки, которые вы фактически получаете в своем приложении?
На Cloudfoundry.com я вижу, что я получил "x-forwarded-for"
class HeaderController {
def headerTest = {
def headerNames = request.headerNames.collect{ it }
headerNames.each {
render "$it : ${request.getHeader(it)}\n"
}
render "Remote addr : ${request.getRemoteAddr()}\n"
render "Forward addr : ${request.getHeader('x-forwarded-for' )}\n"
}
}
В облаке Jelastic "x-forwarded-for" также отображает ваш IP.
В качестве продолжения я предлагаю вам ознакомиться с соответствующей темой в сообществе Jelastic.Итак, предположительно, вам придется настроить конфигурацию ограничения IP таким образом, чтобы она проверяла значение "x-forwarded-for".
Вы настроили экземпляр nginx перед своим котом? Я не уверен, есть ли какие-либо специфические особенности jelastic, но вы должны настроить nginx так, чтобы он передавал ip прокси-службе, см. http://wiki.nginx.org/HttpRealIpModule
Например, вы можете установить собственный заголовок, если не хотите перезаписывать значения по умолчанию:
proxy_set_header X-Real-IP $remote_addr;