天天看点

动态修改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的截图

动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)

当接口调用成功后,系统会返回一个字符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 张洪君

动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)