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

时间:2014-04-23 08:31:41

标签: java spring rest spring-mvc

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

这是控制器:

@Controller
public class LocalProvider {

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

//do something
}

编辑:

通过在spring security.xml中添加以下内容来实现这一目的:

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

5 个答案:

答案 0 :(得分:9)

我会创建一个自定义注释@LocalhostOnly和一个MVC拦截器,它将检查处理程序方法是否使用@LocalhostOnly进行注释,在这种情况下检查从HttpServletRequest.getRemoteAddr()获取的远程IP地址是否为确实是localhost。

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

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

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

修改

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

答案 1 :(得分:5)

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

<Connector port="8080" address="127.0.0.1" maxHttpHeaderSize="8192"

在tomcat的服务器x​​ml中(或在不同的应用服务器中类似)。

对于一个应用程序,请使用add allow =&#34; localhost&#34;上下文:

<Context>
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="localhost"/>
</Context>

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

// Here `upload === multer({ ... })`
router.post('/info', myUpload(upload.single('file')), function(req, res, next) {
  if (err)
    return res.send("Err: "+ err);

  res.render('uploads', {authorised: true});
});

答案 4 :(得分:0)

这是一个可能的解决方案:

步骤进行:

  • 编写一个监听器,在启动时获取服务器端主机名或ip,并将其存储在某处,
  • 将ServletRequest添加为方法的参数
  • 方法内部的
  • 获取客户端主机名:ServletRequest.getServerName(...)
  • 比较客户端&amp;服务器的IP或主机,
  • 如果是本地的,则处理它,
  • 如果不是本地的,则忽略它,可选择提供一些提示,