微點存取控制大理石範例

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,以大量傳輸紅圈存取 bulkMarblesTransferGroup
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • 建立名為 blueMarblesAcl 的微點 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"})

必備條件和設定

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

  1. 下載 Marbles 範例的微點存取控制版本。在開發人員工具頁籤上,開啟範例窗格,然後按一下具有微點 ACL 的組合下的下載連結。擷取此套裝程式,其中包含 Marbles 範例 (fgACL_MarbleSampleCC.zip) 的 ZIP 檔案、要執行範例的 Node.js 檔案 (fgACL-NodeJSCode.zip),以及微點存取控制程式庫 (Fine-GrainedAccessControlLibrary.zip)。
  2. 產生將部署至區塊鏈平台的鏈碼套裝程式:
    • 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. 使用快速部署中所述,安裝並部署更新的範例鏈碼套件 (fgACL_MarbleSampleCC.zip)。
  4. 開發人員工具頁籤上,開啟應用程式開發窗格,然後依照指示下載 Node.js SDK。
  5. 開發人員工具頁籤上,開啟應用程式開發窗格,然後按一下下載開發套件
    1. 使用隨範例下載的 Node.js 檔案將開發套件擷取至相同的資料夾。
    2. network.yaml 檔案中,尋找 certificateAuthorities 項目及其 registrar 項目。下載 network.yaml 時,會遮罩管理員的密碼 (轉換成 ***)。執行此範例時,應以管理員的純文字密碼取代此密碼。
  6. 在您的區塊鏈平台執行處理註冊新的身分識別:
    1. 在 IDCS 中建立新使用者 (在下列步驟中稱為 <NewIdentity>),此 IDCS 會對應至您的租用戶。
    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 傳輸至尖峰。由於對誰可以轉移單個大理石沒有限制,這也應該成功完成。
    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. 刪除大理石作為管理使用者:deleteMarbleAcl ACL 應防止此刪除,因為管理識別沒有必要的 "deleteMarblePermission=true" Fabric 屬性。
    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,呼叫方法的使用者必須具備名為 ". ACLs" 之啟動安裝資源的 CREATE 存取權。不允許重複命名的 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",它會傳回識別可以存取的所有群組。否則,它會根據名稱傳回個別群組詳細資訊 (如果可存取)。

呼叫方法的使用者必須具備此群組的 READ 存取權。

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
呼叫方法的使用者必須具備名為 ". Resources" 之啟動安裝資源的 CREATE 存取權。不允許重複指定的資源。
getResource
  • name
呼叫方法的使用者必須具備資源的 READ 存取權
deleteResource
  • name
呼叫方法的使用者必須具備具名資源的 DELETE 存取權
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具備此資源的 UPDATE 存取權
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
呼叫方法的使用者必須具備此資源的 UPDATE 存取權
updateDescriptionInResource
  • ResourceName
  • newDesc
呼叫方法的使用者必須具備此資源的 UPDATE 存取權
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
呼叫方法的使用者必須具備此資源的 UPDATE 存取權
checkResourceAccess
  • ResourceName
  • access
檢查呼叫方法的目前使用者是否具有指定的指定資源存取權。