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

时间:2019-04-16 12:28:47

标签: java spring http

我正在尝试在我的Spring REST Api中构建一种“访问控制系统”。 我可以创建访问键,并将IP关联

这些访问键应阻止用户从未列入等待列表的网页访问API。 示例:

  • App1 具有键UI12312KADSFKASD32!并与 www.randomurl.org
  • App2 具有密钥KASDFKAS12311 !!! Jka ,并且与 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 个答案:

没有答案