我有一个Grails应用程序,我希望通过ip锁定它,以便只有许多IP范围可以访问该应用程序。我在Config中使用了Spring Security命令来实现这个目的:
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?提前致谢
答案 0 :(得分:4)
对Jelastic实例的所有请求都来自基础架构全局解析器。
所以,你是对的,request.getRemoteAddr()
返回解析器的IP,并且你的允许列表无法识别它。
解决方法是在Jelastic中为您的应用服务器购买external IP。在这种情况下,所有请求都将直接发送到您的实例。
我还建议您加入专用的Jelastic Community,以便分享您的经验并获得其他人的帮助。
答案 1 :(得分:0)
您是否在tomcat前配置了nginx实例?我不确定是否有任何jelastic细节,但您必须配置nginx以便它将ip传递给代理服务,请参阅http://wiki.nginx.org/HttpRealIpModule
你可以,例如如果您不想覆盖默认值,请设置自定义标题:
proxy_set_header X-Real-IP $remote_addr;
答案 2 :(得分:0)
您是否尝试过转储实际在应用中获得的标题?
在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"
}
}
答案 3 :(得分:0)
在Jelastic cloud'x-forwarded-for'中也会显示您的IP。
作为后续跟进,我建议您查看Jelastic Community上的相关主题
所以据说你必须设置你的IP限制配置,以便检查'x-forwarded-for'的值。