天天看點

動态修改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)