实现基于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());
    }
  });
}

比如分为

  1. 面向Application的 open-api 类接口
  2. 面向Web User的 web-api 类接口

这样在分配权限的时候,应用Application只能分配可允许分配给他的接口

如,给应用-A角色 分配只能分配给Application的某些接口
image

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.在前端根据用户权限返回对应的文档内容
  1. 前端要可以获取整个树来对用户分配权限
  2. 查看某个角色有权限的文档,比如某个角色只有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);
}

后面的具体的实现代码就不写了,大体思路如果,代码已经在生成环境运行良好

posted @ 2021-07-12 21:29  随风森林  阅读(505)  评论(0)    收藏  举报