一、绪论
在JAVA项目系统中,后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。
比如某一接口被攻击了或者某一接口存在漏洞,在系统不关闭的情况下,如何控制系统的访问权限。
二、控制接口访问权限的方案
这里介绍通过过滤器的方式,
1、首先所有的接口URL都应该可配置
//禁止访问的url
if (pathMatcher(forbiddenUrl, path)) {
return forbidden(response);
}
//禁止访问的url
if (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配置等配置注入