代码之家  ›  专栏  ›  技术社区  ›  Markus G.

具有IP范围的访问密钥系统

  •  0
  • Markus G.  · 技术社区  · 6 年前

    我试图在我的spring rest api中构建一种“访问控制系统”。 我有能力 创建访问密钥 关联IP 和他们在一起。

    这些访问密钥应防止用户从未等待的网页访问api。 例子:

    • APP1 键ui12312kadsfkasd32! www.randomURL.org网站
    • APP2 钥匙KASDFKAS12311!!!!杰卡 www.anotherurl.io网站

    并且在运行时注册了一个新的应用程序来使用密钥(因此无法通过@crossorigin或websecurityconfigureradapter解决此问题)

    • APP3 在运行时创建 关键AKSDLJFALS23 www.runtime.run运行时

    我已经有了一个genericfilterbean,它过滤请求中是否提供了访问密钥并检查它是否有效。这个很好用。

    现在我想看看 请求的来源 (发送者)与密钥关联。 我会用下面的语句来完成这项工作:

     ((HttpServletRequest) servletRequest).getHeader("Origin");
    

    可以,但有可能 操纵 原始标题。解决这个问题的好办法是什么?

    这里是整个过滤器类。

    @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            if (accessKeyService == null) { //Lazy Load because filter
                ServletContext servletContext = servletRequest.getServletContext();
                WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
                accessKeyService = webApplicationContext.getBean(ApplicationAccessKeyService.class);
            }
    
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
            if (accessKeyService.isApplicationAccessFilterActive()) {
                String API_ACCESS_KEY = servletRequest.getParameter("key");
                String host = ((HttpServletRequest) servletRequest).getHeader("Origin");
                if (API_ACCESS_KEY == null || !accessKeyService.isAccessKeyValid(API_ACCESS_KEY,host)) {
                    ObjectMapper objectMapper = new ObjectMapper();
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    response.setContentType("application/json");
                    response.setCharacterEncoding("UTF-8");
                    response.getWriter().write(objectMapper.writeValueAsString(new CustomExceptionModel("Invalid Access Key or not whitelisted!", HttpStatus.FORBIDDEN)));
                    return;
                }
            }
    
            filterChain.doFilter(servletRequest, response);
        }
    
    0 回复  |  直到 6 年前