动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)
Contents
- 1. 场景描述
- 2. 解决方案
- 2.1 更改继承的接口:ChangeInhertiance
- 2.2 获取区域路径的接口:ClassificationNodes
1. 场景描述
客户使用工作项模板,定制了一个设计变更流程,需要在不同的阶段(流程状态)控制工作项的更改权限。我们知道,在Azure DevOps Server中,控制工作项权限的唯一功能是区域路径,因此需要利用区域路径来动态配置人员权限。
我们采取的方案是,用户发起一个新的变更流程时,系统自动创建一个对应的区域路径,例如新增的区域路径是“团队项目名称/设计变更/1001”,并且将新的工作项设置为这个区域路径;同时,根据业务逻辑,当工作项状态变化(流程前进或倒退)时,系统自动配置不同人员对这个区域路径的权限。例如流程为“新建 > 核查 > 审核 > 关闭”,当状况为核查时,系统配置核查人员的权限;当状况为审核时,系统在区域路径中配置审核人员的权限。
按照上面的方案,我们需求自动创建对应的区域路径,并且需要取消新建区域路径的继承权限,否则就无法实现权限与状态一致的目标。
由于设置区域路径继承权限的方法比较特殊,本文专门在下面的方案中做一个说明。
2. 解决方案
2.1 更改继承的接口:ChangeInhertiance
- 接口名称
- POST http://server/collection/ded5bae5-a2f3-4b4e-80e6-44a5439654bf/_api/_security/ChangeInheritance
- URL 参数:
- permissionSet:权限类型的GUID,这是一个固定值,为“83e28ad4-2d72-4ceb-97b0-c7726d5502c3”
- token:区域路径的唯一标识,示例为“vstfs%3A%2F%2F%2FClassification%2FNode%2Fe485a5cd-8a0d-4610-8d6b-199a5e60a637”,其中的GUID就是区域路径的唯一标识,可以通过后面介绍的接口获取
- inheritPermissions:是否继承,这是一个布尔变量,值为false或true
- 完成的示例为:
http://server/collection/ded5bae5-a2f3-4b4e-80e6-44a5439654bf/_api/_security/ChangeInheritance?
permissionSet=83e28ad4-2d72-4ceb-97b0-c7726d5502c3&
token=vstfs%3A%2F%2F%2FClassification%2FNode%2Fe485a5cd-8a0d-4610-8d6b-199a5e60a637&
inheritPermissions=false
我们在使用C#脚本或者postman调用上面的接口时,系统总是提示下面的文字,
required anti-forgery cookie ”__RequestVerificationToken_L3Rmcw2“ is not present
通过分析后,我们发现这是一个POST类型的请求,必须指定header数据,需要将header类型设置为raw-json,同时还必须在header中添加一个空的json数据“{}”,例如下图是postman的截图
当接口调用成功后,系统会返回一个字符1,如上图。
另外,需要特别注意,由于上面的接口并非微软官方发布的Rest Api接口,如果你的Azure DevOps Server升级后,需要自行测试时间支持新版本,或者在URL中指定版本号,笔者测试的版本为5.0,例如你可以在URL中增加参数“v=5”。
2.2 获取区域路径的接口:ClassificationNodes
上面的接口基本解决了动态修改区域路径继承的问题,但是如何获取区域路径GUID,我们还需要另外一个接口,具体说明如下。
接口名称
- GET https://{server}/{collection}/{project}/_apis/wit/classificationnodes/{structureGroup}
- URL中的structureGroup,有两个选项,areas和iterations
- URL中的参数如下
- $depth:层级,如果不指定这个参数,只返回根节点的区域路径或迭代路径
- path:区域路径或迭代路径的名称,例如“信息系统\已审核”
完成的示例如下:
http://server/collection/ded5bae5-a2f3-4b4e-80e6-44a5439654bf/_apis/wit/classificationnodes/areas?path=信息系统\已审核
或者返回9层区域路径
http://server/collection/ded5bae5-a2f3-4b4e-80e6-44a5439654bf/_apis/wit/classificationnodes/areas?$depth=9
通过上面的接口获取到区域路径的GUID后,我们就可以在第一个接口中,将这个GUID值传入到参数token后,实现动态设置区域路径的继承目标。
如果需要了解更新详细的功能,你还可以从微软Azure DevOps Server 的在线文档,查询更多的权威资料,也欢迎通过下面的联系方式与我沟通,相互学习,相互提高!
https://www.cnblogs.com/danzhang
Azure DevOps MVP 张洪君