我们有一个旧的Spring(~v3.0)应用程序,我们已经添加了一些IP地址过滤到类似于的Web安全表达式:
<http use-expressions="true">
<intercept-url pattern="/login" filters="none" access="hasIpAddress('192.168.1.50')"/>
</http>
这可以按预期运行,但在负载均衡器背后,不允许每个人/login
,因为我们要过滤的实际地址现在位于x-forwarded-host
标题中
有没有办法(通过配置)我可以让Spring Security知道x-forwarded-*
标头?或者我可以在这种情况下使用不同的 Web安全表达式吗?
PS。我撒谎..这是我真正想要过滤的x-forwarded-for
标题
答案 0 :(得分:0)
您可以将Jetty配置为使用原始IP而不是代理的IP,请参阅Jetty Documentation:
X-Forward-for Configuration
X-Forwarded-for
标头和相关标头是事实上的标准,中间人将HTTP标头添加到他们转发的每个请求以描述原始连接。这些标头可以由ForwardedRequestCustomizer
的实例解释,可以添加到HttpConfiguration
,如下所示:<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Set name="outputBufferSize">32768</Set> <Set name="requestHeaderSize">8192</Set> <Set name="responseHeaderSize">8192</Set> <Call name="addCustomizer"> <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg> </Call> </New>
自定义代理转发请求。
此自定义程序查看标头的HTTP请求,表明它已由一个或多个代理转发。具体处理是
- 定义
Forwarded
,由rfc7239X-Forwarded-Host
X-Forwarded-Server
X-Forwarded-For
X-Forwarded-Proto
X-Proxied-Https
如果存在这些标头,则会更新
Request
对象,以便代理不会被视为请求所在的连接的另一个端点还可以定义标头,以便可以自定义转发的SSL会话ID和密码套件