一、背景
Allow List 是白名单,请求的接口如果在白名单里,就被允许。
Block List 是黑名单,请求的接口如果在黑名单里,就被拒绝。
黑白名单是可以一起启用的,优先黑名单。
二、白名单 Allow List
1、新增白名单接口
处理动作可以是Drop connection, 也可以是Return 403 response。
2、验证结果
请求的接口不在白名单里,报错见下:
上面设置的是Drop connection,,如果白名单处理的动作换成Return 403 response,报错将变成如下:
三、黑名单 Block List
1、新增黑名单
接下来,我们将访问接口http://192.168.10.19:9039/api/v1/work/workId/1/detail。
2、验证结果
四、总结
黑名单启用的情况下,白名单也启用,访问某个接口,会发生什么呢?
这里把测试验证结果总结一下:
匹配白名单 | 匹配黑名单 | 结果 |
---|---|---|
否 | 是 | 黑名单生效,Tags = Block List,请求被拒 |
是 | 否 | 请求正常 |
否 | 否 | 白名单生效,Tags = Allow List,请求被拒 |
是 | 是 | 黑名单生效,Tags = Block List (同只匹配黑名单一样),请求被拒 |
所以它的逻辑是:
先判断是否匹配黑名单,如果请求接口在黑名单里,则请求被拒。
再判断是否匹配白名单,如果不在白名单里,则请求也被拒;反之,请求正常通过。
1、实现自己的黑白名单
在日常编程中,我们也会需要或这或那的黑白名单。
比如用户ID、学校ID、IP地址、设备编号等, 以此实现不同粒度的黑白名单。
建议你也像这样配置两个名单,黑名单和白名单,黑名单优先于白名单。
再加上黑白名单的开关变量。
如此设计,适应灵活的业务需求变化。
2、伪代码
Integer schoolId
// 黑名单
if (commonConfig.getEnabledBlack()) {
if (StringUtils.isNotEmpty(schoolIdBlackList) && schoolIdBlackList.contains(schoolId.toString())) {
// 在黑名单里, 返回报错
throw new BizException("学校在黑名单里");
}
}
// 白名单
if (commonConfig.getEnabledWhite()) {
if (StringUtils.isEmpty(schoolIdWhiteList)) {
throw new BizException("学校不在白名单里");
}
if (!schoolIdWhiteList.contains(schoolId.toString())) {
// 不在白名单里, 返回报错
throw new BizException("学校不在白名单里");
}
}
附录
Charles抓包工具系列文章(一)-- Compose 拼接http请求
Charles抓包工具系列文章(二)-- Repeat 回放http请求
Charles抓包工具系列文章(三)-- 接口映射工具(Map Remote和Map Local)
Charles抓包工具系列文章(四)-- Rewrite 重写工具
Charles抓包工具系列文章(五)-- DNS spoofing (DNS域名伪装)
Charles抓包工具系列文章(六)-- Block List 和 Allow List (黑白名单)