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

Spring MVC/REST retrieving data only from certain domain

我有一个关于 Spring MVC/Rest 的问题。

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

我的前端应用程序运行于:http://localhost:9000/,我能够从 API 获取数据。但是,我可以在任何域上执行此操作。我的目标是只提供一个(或列表)domains/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 仍然能够获取甚至 post 数据?

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 */
    }

}