我试图在我的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) {
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);
}