Spring MVC - 仅允许从本地主机到特定控制器的请求

2022-09-04 00:46:28

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

这是控制器:

@Controller
public class LocalProvider {

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

//do something
}

编辑:

通过向弹簧安全性添加以下内容,成功实现了这一点.xml:

<intercept-url pattern="/someURL/*" access="hasIpAddress('127.0.0.1')" />

答案 1

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

如果您使用的是弹簧安全性,那么正如NimChimpsky所建议的那样,最好将远程IP检查插入其中。您可以定义一个检查远程 IP 地址的自定义权限评估程序。

您还可以使用 servlet 过滤器,并在那里执行本地主机检查特定 URL(例如 )。/someURL**

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

编辑

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


答案 2

spring-security提供了@PreAuthorize注释,可用于类型或方法,因此可以替代<intercept-url>@PreAuthorize("hasIpAddress('127.0.0.1')")