微點存取控制 Marble 範例

大理石鏈碼應用程式可讓您建立具有唯一屬性 (名稱、大小、色彩及擁有者) 的資產 (大理石),並將這些資產與區塊鏈網路中的同系參與者進行交易。

此範例應用程式包含各種功能,可讓您檢查如何使用存取控制清單和群組來限制特定使用者的功能。

範例總覽

範例中包含的測試案例包含下列限制以管理資產:

  • 只有具備 "redMarblesTransferPermission" Fabric 屬性的識別才能大量傳輸紅色圈。
  • 只有具備 "blueMarblesTransferPermission" Fabric 屬性的識別才允許大量傳輸藍色圈圈。
  • 只能刪除 "deleteMarblePermission" Fabric 屬性的識別。

fgMarbles_chaincode.go 鏈碼中實行下列程式庫方法,即可強制實行這些限制:

  • 建立名為 bulkMarblesTransferGroup 的微點 ACL 群組。此群組會定義所有可以根據顏色 (大量傳輸) 來傳送圈的身份 :
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • 建立名為 redMarblesAcl 的微點 ACL,此 ACL 提供大量傳輸紅色圈存取 bulkMarblesTransferGroup 的權限:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • 建立名為 blueMarblesAcl 的微點 ACL,此 ACL 可提供大量藍圈傳輸至 bulkMarblesTransferGroup
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • 建立名為 deleteMarbleAcl 的微點 ACL,以根據 "canDeleteMarble=true" Fabric 屬性來限制大理石刪除:
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • 建立名為 marble 的微點 ACL 資源,此資源使用我們建立的各種 ACL 來控制作業:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

先決條件與設定

若要執行大理石範例的微點存取控制版本,請完成下列步驟:

  1. 下載微點存取控制版本的 Marbles 範例。在開發人員工具頁籤上,開啟範例窗格,然後按一下微點 ACL 大理石下的下載連結。擷取此套裝程式 - 它包含大理石範例 (fgACL_MarbleSampleCC.zip) 的 ZIP 檔案、執行範例的 Node.js 檔案 (fgACL-NodeJSCode.zip) 以及微點存取控制程式庫 (Fine-GrainedAccessControlLibrary.zip)。
  2. 僅限 Hyperledger Fabric v2.x :產生將部署至區塊鏈平台的鏈碼套件:
    • fgACL_MarbleSampleCC.zip 檔案的內容解壓縮至 fgACL_MarbleSampleCC 目錄。fgACL_MarbleSampleCC 目錄的內容將是 fgACL_Operations.gofgGroups_Operations.gofgMarbles_chaincode.gofgResource_Operations.gogo.mod 檔案,以及 oracle.com 目錄。
    • 從命令行移至 fgACL_MarbleSampleCC 目錄,然後執行 GO111MODULE=on go mod vendor。此命令會下載必要的相依性並將它們新增至 vendor 目錄。
    • 以 ZIP 格式壓縮 fgACL_MarbleSampleCC 目錄的所有內容 (四個 Go 檔案、go.mod 檔案以及 vendororacle.com 目錄)。您的鏈碼已準備好部署到區塊鏈平台。
  3. 僅限 Hyperledger Fabric v1.4.7 :產生將部署至區塊鏈平台的鏈碼套件:
    • 安裝協力廠商:
      go get -u github.com/kardianos/govendor
    • fgACL_MarbleSampleCC.zip 的內容擷取至 fgACL_MarbleSampleCC 目錄。fgACL_MarbleSampleCC 目錄的內容為:fgACL_Operations.gofgGroups_Operations.gofgMarbles_chaincode.go fgResource_Operations.go 以及 vendor 目錄。
    • 從命令行移至 fgACL_MarbleSampleCC 目錄,然後執行 govendor sync。這會下載必要的相依性 (github.com/op/go-logging),並將其新增至 vendor 目錄。
    • 以 ZIP 格式壓縮 fgACL_MarbleSampleCC 目錄的所有內容 (四個 Go 檔案和 vendor 目錄)。您的鏈碼已準備好部署到區塊鏈平台。
  4. 使用快速部署中所述,安裝並部署更新的連鎖程式碼套裝程式 (fgACL_MarbleSampleCC.zip)。
  5. 開發人員工具頁籤中,開啟應用程式開發窗格,然後依照指示下載 Node.js SDK。
  6. 開發人員工具頁籤中,開啟應用程式開發窗格,然後按一下下載開發套件
    1. 使用隨範例下載的 Node.js 檔案,將開發套件擷取至相同的資料夾。
    2. network.yaml 檔案中,尋找 certificateAuthorities 項目及其 registrar 項目。下載 network.yaml 時,會遮罩管理員的密碼 (轉換成 ***)。執行此範例時,應以管理員的純文字密碼取代。
  7. 在您的區塊鏈平台執行處理註冊新身分識別:
    1. 在對應至您租用戶的 IDCS 中,在 IDCS 中建立新使用者 (在下列步驟中稱為 <NewIdentity>)。
    2. 為此使用者提供執行處理的 CA_User 應用程式角色。

實作微點存取控制 Marble 範例

下列步驟將註冊您的新使用者,並使用提供的 Node.js 命令檔實行 ACL 限制。

  1. 註冊新使用者:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. 初始化:初始化存取控制清單。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. 建立存取控制清單、群組和資源:這會建立總覽中描述的 ACL 資源。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. 建立您的測試大理石資源:這會建立數個測試大理石資產 - blue1 和 blue2,由 tom 擁有,red1 和 red2 由 jerry 擁有,以及 green1 和 green2 由 spike 擁有。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

測試存取控制

為了測試我們的存取控制清單僅允許正確的使用者執行每個功能,我們將執行一些範例案例。

  1. 移轉大理石:我們正在將大理石 blue1 從 tom 移轉至 jerry。由於沒有可移轉單一大理石的人員限制,因此必須順利完成此作業。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. 以管理使用者身分傳輸大理石:我們正在將大理石 blue1 從 jerry 傳輸至 spike。由於沒有可以傳輸單一大理石的人員限制,因此也應該順利完成。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. 取得歷史記錄:現在我們將查詢名為 blue1 的大理石歷史記錄。它應該返回,它先被轉移到傑瑞,然後被激增。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. 傳輸所有紅色大理石:redMarblesAcl ACL 應允許此傳輸,因為新註冊的識別具有必要的 "redMarblesTransferPermission=true" Fabric 屬性,因此應將兩個紅色大理石傳輸至 tom。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. 以管理使用者身分傳輸所有紅色大理石:管理識別沒有 "redMarblesTransferPermission=true" Fabric 屬性,因此 redMarblesAcl ACL 應封鎖此傳輸。
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. 傳輸所有綠色大理石:依照預設,只允許明確定義的存取權。因為沒有允許大量移轉綠色圈的 ACL,所以這應該會失敗。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. 刪除大理石:deleteMarbleAcl ACL 允許此項刪除,因為新註冊的識別具有必要的 "deleteMarblePermission=true" Fabric 屬性。
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. 以管理使用者的身分刪除大理石:由於管理識別沒有必要的 "deleteMarblePermission=true" Fabric 屬性,因此 deleteMarbleAcl ACL 應避免進行此刪除。
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

範例檔案參照

這些表格列出範例中所含鏈碼和應用程式檔案中的可用方法。

fgMarbles_chaincode.go

函數 描述
initMarble 建立新大理石
transferMarble 根據名稱將大理石從一個擁有者轉移到另一個擁有者
createTestMarbles 呼叫 initMarble 以建立新的範例大理石來進行測試
createFineGrainedAclSampleResources 建立微點存取控制清單 (ACL)、群組以及測試案例所需的資源
transferMarblesBasedOnColor 將特定顏色的多個圈存轉移給另一個擁有者
delete 刪除大理石
readMarble 根據名稱傳回大理石的所有屬性
getHistoryForMarble 傳回大理石值的歷史記錄

fgACL_Operations.go

方法 參數 描述
getACL
  • name
取得具名 ACL 或讀取所有 ACL。呼叫方法的使用者必須具有具名 ACL 的 READ 存取權。
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
若要建立新的 ACL,呼叫方法的使用者必須具備 CREATE 存取名為 ". ACLs" 的啟動安裝資源。不允許重複的具名 ACL
deleteACL
  • name
呼叫方法的使用者必須具有具名 ACL 的 DELETE 存取權。
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
addPatternToACL
  • aclName
  • BindPattern
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
removePatternFromACL
  • aclName
  • BindPattern
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
updateDescription
  • aclName
  • newDesc
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
removeBindACL
  • aclName
  • bindAclNameToRemove
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
addAccess
  • aclName
  • accessName
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
removeAccess
  • aclName
  • accessName
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,而且指定的 ACL 必須存在。
ACLInitialization
此函數是用來起始微點 ACL 支援。

fgGroups_Operations.go

方法 參數 描述
getGroup
  • name

如果 name="GetAll",則會傳回識別具有存取權的所有群組。否則,系統會根據姓名傳回個別群組詳細資料 (若可存取的話)。

呼叫方法的使用者必須具有此群組的「讀取」存取權。

createGroup
  • name
  • description
  • patterns
  • bindACLs

傳回 successerror

呼叫方法的使用者必須具備啟動安裝群組 ". Group" 的 CREATE 存取權

deleteGroup
  • name
呼叫方法的使用者必須具有此群組的 DELETE 存取權。
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。
updateDescriptionForGroup
  • groupName
  • newDesc
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。
addMembersToGroup
  • groupName
  • pattern
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。
removeMembersFromGroup
  • groupName
  • pattern
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。

fgResource_Operations.go

方法 參數 描述
createResource
  • name
  • description
  • bindACLs
呼叫方法的使用者需要有 CREATE 存取名為 ". Resources" 的啟動安裝資源。不允許重複的指定資源。
getResource
  • name
呼叫方法的使用者必須具有資源的讀取存取權
deleteResource
  • name
呼叫方法的使用者必須具有具名資源的 DELETE 存取權
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有此資源的 UPDATE 存取權
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具有此資源的 UPDATE 存取權
updateDescriptionInResource
  • ResourceName
  • newDesc
呼叫方法的使用者必須具有此資源的 UPDATE 存取權
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
呼叫方法的使用者必須具有此資源的 UPDATE 存取權
checkResourceAccess
  • ResourceName
  • access
檢查目前呼叫方法的使用者是否具有指定資源的存取權。