基於屬性的存取控制
Hyperledger Fabric 支援使用基於屬性的存取控制(ABAC, Attribute-Based Access Control)來控制使用者的存取權限。在進行使用者的身份註冊時,登入認證(ECert)可以包含一個或多個屬性名稱和值,鏈碼運行時可以提取屬性值來進行存取控制決策。
例如,您正在開發一個名為 app1 的應用,只有 app1 的管理員才可以訪問一個特定的 chaincode 操作。您的 chaincode 可以根據調用者的認證中是否包含的 app1Admin 屬性以及該屬性值是否為 “true” 來決定是否允許訪問。
關於 Hyperledger Fabric ABAC 功能,更多請參見 Attribute-Based Access Control。
屬性集設定
您可以在控制台建立組織使用者時,開啟進階,設定使用者的屬性集,用於控制使用者的存取權限。
登入阿里雲BaaS控制台。
在概覽頁面,找到我的組織地區,找到目標組織,單擊組織的名稱。
單擊使用者標籤頁。
單擊新增使用者,在彈框中開啟進階,即可設定使用者的屬性集。
建立使用者後,可以看到使用者相關的屬性集。

屬性集設定規範:
使用逗號(,)分割為不同的屬性
等號(=)前為屬性名稱, 等號(=)後為該屬性的值
屬性名稱及屬性值必須由英文字母或數字組成
屬性名稱及屬性值均為字串類型
樣本:
屬性集內容:app1Admin=true,permissions=7在使用者的登入認證中,其屬性值為:
{"attrs":{"app1Admin":"true","permissions":"7","hf.Affiliation":"","hf.EnrollmentID":"abacUser1","hf.Type":"client"}}其中,hf.EnrollmentID、hf.Type、hf.Affiliation為每個身份自動註冊的三個屬性。
鏈碼中擷取使用者屬性
詳細開發文檔請參考:chaincode/shim/ext/cid
id, err := cid.New(stub)
fmt.Println("client ID object:")
fmt.Println(id)
if err != nil {
return shim.Error(err.Error())
}
val, ok, err = cid.GetAttributeValue(stub, "permissions")
if err != nil {
return shim.Error(err.Error())
}
if !ok {
return shim.Error("The client identity does not possess the attribute:permissions")
}
err := cid.AssertAttributeValue(stub, "permissions", "7")
if err != nil {
return shim.Error("The client identity does not have the permissions")
}
fmt.Println("permissions:")
fmt.Println(val)