Spring MVC:单个控制器方法的IP限制

时间:2015-09-15 08:49:26

标签: java api spring-mvc spring-security

我需要为来自与特定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”,但是我该怎样才能继续?有更好的解决方案吗?

2 个答案:

答案 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是如何设置它的一个很好的例子。