我需要为来自与特定IP不同的IP请求隐藏特定的API。 例如,如果我尝试使用它并且我的IP是192.168.1.1,那么这应该有效,但如果我的IP是192.168.1.2则不行。
@RequestMapping(value = "/test/{id}", method = RequestMethod.GET)
@ResponseBody
@IpRestricted
public void download(@PathVariable("id") String id) {
...
}
我读过我可以创建一个特定的注释,在这个例子中我称之为“@IpRestricted”,但是我该怎样才能继续?有更好的解决方案吗?
答案 0 :(得分:2)
然后我意识到我可以在不使用弹簧安全的情况下完成它。 我做了一个这样的注释:
@Retention(RetentionPolicy.RUNTIME)
public @interface IpRestricted {
}
比检查HandlerInterceptor preHandle方法中的请求IP地址:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod)handler;
if (method.getMethodAnnotation(IpRestricted.class)!=null) {
if (!request.getRemoteAddr().equals("192.168.1.1")) {
throw new UnauthorizedException("Ip not authorized");
}
}
}
[....]
}
对于下载方法:
@RequestMapping(value = "/test/{id}", method = RequestMethod.GET)
@ResponseBody
@IpRestricted
public void download(@PathVariable("id") String id) {
...
}
那就是它!
答案 1 :(得分:0)
我认为此案例中可用的最佳Spring解决方案是 Spring Security 中的hasIpAddress()
方法。有许多不同的方法可以通过Spring Security配置服务权限,并且还实现了基于IP的解决方案。
Here是如何设置它的一个很好的例子。