我有一个运行 Apache Tomcat 并使用 Spring 开发的服务器端应用程序。我需要阻止某些用户访问本地网络之外的应用程序。我一直在寻找一段时间,但我找不到解决这个问题的方法。Spring 是否提供了基于用户权限限制用户内部/外部访问的功能?
3 回答
servlet 规范允许您查看远程 IP 地址,ServletRequest#getRemoteAddr()
. 通过 IP 地址限制访问的传统方法是使用servlet 过滤器将 IP 地址范围列入白名单或黑名单。您可以搜索可以添加到 spring 应用程序的 servlet 过滤器实现。你只需要配置它。但是......确保您选择的实施方案考虑到以下内容。如果你找不到一个可以解释这个的,考虑写你自己的。
需要注意的主要一点是,您的服务器看到的“远程地址”根本不能保证识别客户端计算机。这是一个网络问题,而不是 Spring/servlet 问题。您的服务器看到的远程地址,甚至可能是您自己内部网络上的负载平衡器或其他网络设备的 IP。
阅读 HTTP 标头X-Forwarded-For。如果您的内部网络上的反向代理或某些配置中的负载平衡器在 TCP/IP 堆栈(例如 HTTP)中的应用程序层转发请求,并因此更改您的服务器所看到的原始 IP,在 HTTP 的情况下该设备通常会在此标头中包含或添加原始 IP。事实上,这个标头可以包含原始 IP 地址列表,以防请求在到达您自己的网络之前通过原始组织中的多个NAT 或代理或 Internet 上的路径。
我建议将允许的地址列入保守的白名单,而不是将禁止的地址列入黑名单。如果您的网络架构发生了变化,这可能会更加健壮,但是如果在内部网络上重新分配 IP,您仍然需要小心。
您的 servlet 过滤器可以结合使用ServletRequest#getRemoteAddr()
并解析X-Forwarded-For
标头。
还要记住在您的设计和白名单或黑名单中包含任何 IPv6 地址。
我对 Spring 一无所知,但是,假设您可以访问 Tomcat 的配置文件,您可以Valve
在 Tomcat 本身或特定 webapps 的配置文件中设置一个以根据 IP 地址过滤访问。
http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html#Remote_Address_Filter http://vicker313.wordpress.com/2010/11/05/restrict-ip-coming-to-tomcat-service /
hasIpAddress(String)
是的,您可以在使用 XML 表达式时使用 Web 安全异常