微服务平台权限配置优化
业务背景
痛点:
- 一部分项目,管控不足,外包人员存在注释权限验证标签导致权限无受管控。
- 权限配置繁琐,通常dev环境配置完后,uat、prod环境需要重新配置一次。
需求:
- 实现快速导入接口配置信息。
- 不同环境之间配置数据同步。
设计方案
- 借助 Swagger 注解,实现权限接口一键导入。
- 增加 DEV -> UAT -> PROD 单向数据同步(仅 菜单、接口、资源、服务)。
- 增加 每个请求判断 是否存在鉴权注解。
业务代码改造
目标:将接口信息填写在 swagger 注解上,再通过 swagger 文档 api 获取相关信息实现一键导入接口。
Controller类注解
改造内容:
@Api
注解,必须有:tags、description属性@PreAuth
注解,必须有:replace属性
属性值说明:
注解 | 属性值 | 说明 | 取值样例 |
---|---|---|---|
@Api | tags | swagger左侧菜单名称 | oa 系统 流程表单 |
@Api | description | 接口所属类 + 该类权限码 | com.github.arrow.oa.controller.OaFlowController#oa:oaFlow: |
@PreAuth | replace | 该类权限码(系统路由+类路由) | 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属性
属性值说明:
注解 | 属性值 | 说明 | 取值样例 |
---|---|---|---|
@ApiOperation | value | Swagger接口方法名称 | 推送 OA 系统流程表单 |
@ApiOperation | notes | Swagger接口方法详细描述 | 推送 OA 系统流程表单 |
@ApiOperation | nickname | 方法名 | pushOa |
@PreAuth | value | 定义方法权限码(方法名) | 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}
注意,因为使用了 nickname 属性,导致接口url重复自动变成 _1,需要手动去掉这部分。
接口鉴权校验
通过判断是否含 @PreAuth
注解进行管控。
实施结果
接口配置导入&跨环境同步
评论