实现基于swagger的资源权限校验和权限动态文档
转载请注明来源
问题产生的背景因素:
由于在分布式环境下,几十上百的服务,要管理接口的权限如果靠人工维护工作量极大,还要考虑接口的新增,删除等,怎么去自动化的完成这部分的工作量,成为了需要思考的问题
也就是图1的资源数据的配置问题

首先考虑到的就是去改swagger,让他可以支持我们的业务需求。
那么怎么做到呢,
1. 首先得对所有服务的Api进行汇总和分组

有一个服务 interface-manage-service 去定时(可能是半个小时执行一次)的拉取其他服务的swagger 文档, 然后根据接口的tag 进行分类
/* 刷新swagger Doc放入Cache中
*
* @param consumer 回调处理之后的服务ID
*/
public void refreshSwaggerDocToCache(Consumer<String> consumer) {
apiPullUtils.pullAllDoc("default", unformattedServiceDoc -> {
setServiceName(unformattedServiceDoc.getServiceId(), unformattedServiceDoc.getServiceName());
ServiceDoc<Collection<Api>> formattedServiceDoc = apiPullUtils
.format(unformattedServiceDoc);
// 缓存未格式化的数据
cacheUnformattedServiceDoc(unformattedServiceDoc);
if (formattedServiceDoc != null) {
// 缓存格式化的数据
cacheFormattedServiceDoc(formattedServiceDoc);
consumer.accept(unformattedServiceDoc.getServiceId());
}
});
}
比如分为
- 面向Application的 open-api 类接口
- 面向Web User的 web-api 类接口
这样在分配权限的时候,应用Application只能分配可允许分配给他的接口
如,给应用-A角色 分配只能分配给Application的某些接口

2. 对所有的Api进行格式化,提取关键字段,建立数据模型
@Data
public class Api {
private String parentId;
private Integer level;
private String title;
/**
* OPEN|WEB
*/
private Set<String> apiTypes;
/**
* 服务名称 --> 文件服务
*/
private String serviceName;
/**
* 服务编码 --> file-service
*/
private String serviceCode;
/**
* 接口名称 --> 文件接口
*/
private String apiCategory;
/**
* 接口地址 --> /user/list
*/
private String apiUri;
/**
* 接口描述 --> 创建元数据并申请上传签名
*/
private String apiDesc;
}
3.在前端根据用户权限返回对应的文档内容
- 前端要可以获取整个树来对用户分配权限
- 查看某个角色有权限的文档,比如某个角色只有2个接口的权限,只能返回这2个接口,这2个接口只包含了3个DTO的引用,只能被返回折3个DTO
首先看需要实现的接口
public interface ResourceService {
/**
* 构建接口资源树. 前端用来分配的api树形列表
*
* @param apiType 接口类型
* @return 接口资源树
*/
TreeNode<ResourceDTO, String> tree(String apiType);
/**
* 查看某个角色的文档.
*
* @param roleId 角色ID
* @return 文件Json值
*/
Json apiDocs(Long roleId);
}
后面的具体的实现代码就不写了,大体思路如果,代码已经在生成环境运行良好
浙公网安备 33010602011771号