微服务平台权限配置优化

业务背景

痛点:

  1. 一部分项目,管控不足,外包人员存在注释权限验证标签导致权限无受管控。
  2. 权限配置繁琐,通常dev环境配置完后,uat、prod环境需要重新配置一次。

需求:

  1. 实现快速导入接口配置信息。
  2. 不同环境之间配置数据同步。

设计方案

  1. 借助 Swagger 注解,实现权限接口一键导入。
  2. 增加 DEV -> UAT -> PROD 单向数据同步(仅 菜单、接口、资源、服务)。
  3. 增加 每个请求判断 是否存在鉴权注解。

业务代码改造

目标:将接口信息填写在 swagger 注解上,再通过 swagger 文档 api 获取相关信息实现一键导入接口。

Controller类注解

改造内容:

  • @Api注解,必须有:tags、description属性
  • @PreAuth注解,必须有:replace属性

属性值说明:

注解属性值说明取值样例
@Apitagsswagger左侧菜单名称oa 系统 流程表单
@Apidescription接口所属类 + 该类权限码com.github.arrow.oa.controller.OaFlowController#oa:oaFlow:
@PreAuthreplace该类权限码(系统路由+类路由)oa:oaFlow:

完整样例:

@Slf4j
@Validated
@RestController
@RequestMapping("/oaFlow")
@Api(value = "OaFlow", tags = "oa 系统 流程表单", description = "com.github.arrow.oa.controller.OaFlowController#oa:oaFlow:")
@PreAuth(replace = "oa:oaFlow:")
public class OaFlowController {
}

Controller接口方法注解

改造内容:

  • @ApiOperation注解,必须有:value、notes、nickname属性
  • @PreAuth注解,必须有:replace属性

属性值说明:

注解属性值说明取值样例
@ApiOperationvalueSwagger接口方法名称推送 OA 系统流程表单
@ApiOperationnotesSwagger接口方法详细描述推送 OA 系统流程表单
@ApiOperationnickname方法名pushOa
@PreAuthvalue定义方法权限码(方法名)hasPermit('{}pushOa')

完整样例:

@ApiImplicitParams({
        @ApiImplicitParam(name = "formCode", value = "流程表单模板编码", dataType = "string", paramType = "query"),
        @ApiImplicitParam(name = "pushParam", value = "模板表单推送 OA系统 参数", paramType = "body"),
})
@ApiOperation(value = "推送 OA 系统流程表单", notes = "推送 OA 系统流程表单", nickname = "pushOa")
@PostMapping("/push")
@SysLog("'推送表单:' + #formCode")
@PreAuth("hasPermit('{}pushOa')")
public R<String> pushOa(@RequestParam String formCode, @RequestBody OaPushParam pushParam) {
    return R.success(oaTool.postPushOa(formCode, pushParam));
}

接口功能开发

  • http://{serviceName}/api/gate/v2/api-docs?group={label}
  • 特殊情况下使用(例如网关服务),http://{serviceName}/v2/api-docs?group={label}

获取Swagger文档

注意,因为使用了 nickname 属性,导致接口url重复自动变成 _1,需要手动去掉这部分。

通过Swagger文档,导入接口信息

接口鉴权校验

通过判断是否含 @PreAuth 注解进行管控。

image.png

实施结果

接口配置导入&跨环境同步

image.png