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)
我将创建一个自定义注释@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的答案可能是最好的方法.
弹簧安全提供了可以在类型或方法中使用这样一种替代@PreAuthorize注释<intercept-url>
可以是@PreAuthorize("hasIpAddress('127.0.0.1')")
要限制访问您的整个网络服务器,您可以使用
<Connector port="8080" address="127.0.0.1" maxHttpHeaderSize="8192"
Run Code Online (Sandbox Code Playgroud)
在tomcat的服务器xml中(或在不同的app服务器中类似).
对于一个应用程序,请在上下文中添加allow ="localhost":
<Context>
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="localhost"/>
</Context>
Run Code Online (Sandbox Code Playgroud)
但对于特定的控制器方法,您最好使用弹簧安全性.
归档时间: |
|
查看次数: |
14944 次 |
最近记录: |