一、绪论
在JAVA项目系统中,后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。
比如某一接口被攻击了或者某一接口存在漏洞,在系统不关闭的情况下,如何控制系统的访问权限。
二、控制接口访问权限的方案
这里介绍通过过滤器的方式,
1、首先所有的接口URL都应该可配置
//禁止访问的url
if (pathMatcher(forbiddenUrl, path)) {
return forbidden(response);
}
//禁止访问的urlif (pathMatcher(forbiddenUrl, path)) {return forbidden(response);}
path 获取到请求的URL
forbiddenUrl 被禁止访问的URL列表。这里可以是多个或者一个。
String path = request.getURI().getPath(); 获取前端请求的URL
private boolean pathMatcher(List<String> urlList, String requestUri) {for (String url : urlList) {if (antPathMatcher.match(url, requestUri)) {return true;}}return false;}
2、将禁止访问信息返回到前端
/*** 无权限* * @param response* @return*/private Mono<Void> forbidden(ServerHttpResponse response) {log.info("========暂无权限访问========");String responseDataStr = JSON.toJSON(ResponseData.error(HttpStatus.FORBIDDEN.value(), "forbidden to acc 接口已关闭或无权访问")).toString();byte[] bytes = responseDataStr.getBytes(StandardCharsets.UTF_8);DataBuffer buffer = response.bufferFactory().wrap(bytes);response.setStatusCode(HttpStatus.FORBIDDEN);return response.writeWith(Mono.just(buffer));}
其中配置的URL列表方式可以通过数据库表或者apollo配置等配置注入