Spring MVC - 仅允许来自localhost的请求到特定控制器

Urb*_*leg 11 java rest spring spring-mvc

我有一个特定的控制器(在许多其他控制器中).我想允许仅从localhost调用此控制器的请求.什么是最好的方法呢?

这是控制器:

@Controller
public class LocalProvider {

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
@ResponseBody
public responseDTO doSomethingForLocalRequest(@RequestBody ReqDTO reqDTO ) {

//do something
}
Run Code Online (Sandbox Code Playgroud)

编辑:

通过在spring security.xml中添加以下内容,Succesffuly实现了这一点:

<intercept-url pattern="/someURL/*" access="hasIpAddress('127.0.0.1')" />
Run Code Online (Sandbox Code Playgroud)

Kre*_*sek 9

我将创建一个自定义注释@LocalhostOnly和一个MVC拦截器,它将检查处理程序方法是否注释,@LocalhostOnly并在那种情况下检查从该HttpServletRequest.getRemoteAddr()确实是从本地主机获取的远程IP地址.

如果您正在使用Spring安全性,那么正如NimChimpsky建议的那样,最好插入远程ip检查.您可以定义一个检查远程IP地址的自定义权限评估程序.

您还可以使用servlet过滤器并在那里进行localhost检查以获取特定的URL(例如/someURL**).

最后,请注意,如果您将在某个时刻在反向代理后面运行应用程序,则所有请求看起来都是从localhost到达的(即,如果反向代理安装在同一主机上).在这种情况下,您需要从X-Forwarded-For标头中获取IP地址.

编辑

Spring安全实际上有ip检查表达式,hasIpAddress('127.0.0.1')所以NimChimpsky的答案可能是最好的方法.


eze*_*zer 6

弹簧安全提供了可以在类型或方法中使用这样一种替代@PreAuthorize注释<intercept-url> 可以是@PreAuthorize("hasIpAddress('127.0.0.1')")


Nim*_*sky 5

要限制访问您的整个网络服务器,您可以使用

<Connector port="8080" address="127.0.0.1" maxHttpHeaderSize="8192"
Run Code Online (Sandbox Code Playgroud)

在tomcat的服务器x​​ml中(或在不同的app服务器中类似).

对于一个应用程序,请在上下文中添加allow ="localhost":

<Context>
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="localhost"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

但对于特定的控制器方法,您最好使用弹簧安全性.