我正在尝试在我的Spring REST Api中构建一种“访问控制系统”。 我可以创建访问键,并将IP关联。
这些访问键应阻止用户从未列入等待列表的网页访问API。 示例:
在运行时,将注册一个新应用程序以使用密钥(因此无法通过@CrossOrigin或WebSecurityConfigurerAdapter解决此问题)
我已经拥有的是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);
}