我有一个特定的控制器(在许多其他控制器中)。 我想允许仅从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')" />
答案 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的服务器xml中(或在不同的应用服务器中类似)。
对于一个应用程序,请使用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)
这是一个可能的解决方案:
步骤进行:
ServletRequest.getServerName(...)