Spring MVC / REST仅从特定域检索数据

时间:2015-11-05 23:13:14

标签: spring rest spring-mvc spring-security spring-rest

我对Spring MVC / Rest有疑问。

假设我有一项服务,您可以通过输入以下网址http://localhost:8080/project/api/get/user/1来检索用户的用户详细信息(JSON)。

我的前端应用程序在http://localhost:9000/上运行,我可以从API获取数据。但是,我可以在任何域上执行此操作。我的目标是只提供单个(或列表)域/ ips。

所以我在我的API中添加了以下过滤器,以便它只接受来自localhost:9000

的调用
@Component
public class CORSFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain)
            throws ServletException, IOException {
        res.addHeader("Access-Control-Allow-Origin","http://localhost:9000");
      /* other code*/

现在它确实阻止来自其他域的调用。但是,如果我使用像Postman这样的工具,我仍然可以获取数据!我错过了什么吗?我在这里做的是一种安全和正确的方式吗?如果我使用Postman,为什么我仍然能够获取甚至发布数据?

1 个答案:

答案 0 :(得分:1)

CORS仅使用AJAX影响两个不同域之间的请求

如果您只想影响某些控制器,可以像

那样对它们进行声明
@PreAuthorize("hasIpAddress('192.168.1.0/24')")
@Controller
public class Controller {

...

}

否则,如果您想限制所有请求,您可以自定义过滤器

@Component
public class ValidDomainFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain)
            throws ServletException, IOException {
        String ipAddress = req.getRemoteAddr();
        int port = req.getRemotePort();

        if(isValidDomain(ipAddress,port)){
            filterChain.doFilter(req, res);
        } else {
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(req,res);
          /* redirect or do whatever you need*/
        }
    }

    private boolean isValidDomain(String ipAddress, int port){
    /* do validation */
    }

}