微點存取控制大理石範例
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 範例的微點存取控制版本,請完成下列步驟:
- 下載 Marbles 範例的微點存取控制版本。在開發人員工具頁籤上,開啟範例窗格,然後按一下具有微點 ACL 的組合下的下載連結。擷取此套裝程式,其中包含 Marbles 範例 (
fgACL_MarbleSampleCC.zip
) 的 ZIP 檔案、要執行範例的 Node.js 檔案 (fgACL-NodeJSCode.zip
),以及微點存取控制程式庫 (Fine-GrainedAccessControlLibrary.zip
)。 - 產生將部署至區塊鏈平台的鏈碼套裝程式:
- 將
fgACL_MarbleSampleCC.zip
檔案的內容解壓縮至fgACL_MarbleSampleCC
目錄。fgACL_MarbleSampleCC
目錄的內容將是fgACL_Operations.go
、fgGroups_Operations.go
、fgMarbles_chaincode.go
、fgResource_Operations.go
和go.mod
檔案,以及oracle.com
目錄。 - 從命令行移至
fgACL_MarbleSampleCC
目錄,然後執行GO111MODULE=on go mod vendor
。此命令會下載必要的相依性並將其新增至vendor
目錄。 - 以 ZIP 格式壓縮
fgACL_MarbleSampleCC
目錄的所有內容 (四個 Go 檔案、go.mod
檔案以及vendor
和oracle.com
目錄)。您的鏈碼已準備好部署到區塊鏈平台。
- 將
- 如使用快速部署中所述,安裝並部署更新的範例鏈碼套件 (
fgACL_MarbleSampleCC.zip
)。 - 在開發人員工具頁籤上,開啟應用程式開發窗格,然後依照指示下載 Node.js SDK。
- 在開發人員工具頁籤上,開啟應用程式開發窗格,然後按一下下載開發套件。
- 使用隨範例下載的 Node.js 檔案將開發套件擷取至相同的資料夾。
- 在
network.yaml
檔案中,尋找certificateAuthorities
項目及其registrar
項目。下載network.yaml
時,會遮罩管理員的密碼 (轉換成***
)。執行此範例時,應以管理員的純文字密碼取代此密碼。
- 在您的區塊鏈平台執行處理註冊新的身分識別:
- 在 IDCS 中建立新使用者 (在下列步驟中稱為
<NewIdentity>
),此 IDCS 會對應至您的租用戶。 - 為此使用者提供執行處理的
CA_User
應用程式角色。
- 在 IDCS 中建立新使用者 (在下列步驟中稱為
實作微點存取控制 Marble 範例
完成下列步驟以註冊您的新使用者,並使用提供的 Node.js 命令檔實行 ACL 限制。
- 註冊新使用者:
node registerEnrollUser.js <NewIdentity> <Password>
- 初始化:初始化存取控制清單。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- 建立存取控制清單、群組和資源:這會建立總覽中描述的 ACL 資源。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- 建立您的測試大理石資源:這會建立數個測試大理石資產 - blue1 和 blue2 (由 tom 擁有)、red1 和 red2 (由 jerry 擁有) 以及 green1 和 green2 (由 spike 擁有)。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
測試存取控制
若要測試存取控制清單是否只允許正確的使用者執行每個功能,請執行一些範例案例。
- 轉接大理石:將大理石
blue1
從 tom 轉接到 jerry。因為對於誰可以轉移單個大理石沒有限制,這應該成功完成。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
- 以管理使用者的身分傳輸大理石:將大理石
blue1
從 Jerry 傳輸至尖峰。由於對誰可以轉移單個大理石沒有限制,這也應該成功完成。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
- 取得歷史記錄:查詢名稱為
blue1
的大理石歷史記錄。它應該讓它先被轉移到傑瑞,然後被激動。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- 傳輸所有紅色組合:
redMarblesAcl
ACL 應允許此傳輸,因為新註冊的識別具有必要的"redMarblesTransferPermission=true"
Fabric 屬性,所以應該將兩個紅色組合傳輸到 tom。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- 以管理使用者的身分傳輸所有紅色組合:管理識別沒有
"redMarblesTransferPermission=true"
Fabric 屬性,因此redMarblesAcl
ACL 應封鎖此傳輸。node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
- 傳輸所有綠色組合:預設只允許明確定義的存取。因為沒有允許大量傳輸綠色圈的 ACL,所以這應該會失敗。
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- 刪除大理石:
deleteMarbleAcl
ACL 允許此刪除,因為新註冊的識別具有必要的"deleteMarblePermission=true"
Fabric 屬性。node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- 刪除大理石作為管理使用者:
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 |
|
取得指定的 ACL 或讀取所有 ACL。呼叫方法的使用者必須具有具名 ACL 的 READ 存取權。 |
createACL |
|
若要建立新的 ACL,呼叫方法的使用者必須具備名為 ". ACLs" 之啟動安裝資源的 CREATE 存取權。不允許重複命名的 ACL
|
deleteACL |
|
呼叫方法的使用者必須具有具名 ACL 的 DELETE 存取權。 |
updateACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
addAfterACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
addBeforeACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
addPatternToACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
removePatternFromACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
updateDescription |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
removeBindACL |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
addAccess |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
removeAccess |
|
呼叫方法的使用者必須具有具名資源的 UPDATE 存取權,且具名 ACL 必須存在。 |
ACLInitialization |
|
此函數主要用於起始微點 ACL 支援。 |
fgGroups_Operations.go
方法 | 參數 | 描述 |
---|---|---|
getGroup |
|
如果 name= 呼叫方法的使用者必須具備此群組的 READ 存取權。 |
createGroup |
|
傳回 呼叫方法的使用者必須具備啟動安裝群組 |
deleteGroup |
|
呼叫方法的使用者必須具備此群組的 DELETE 存取權。 |
addAfterGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
addBeforeGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
updateDescriptionForGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
removeBindAclFromGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
addMembersToGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
removeMembersFromGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
fgResource_Operations.go
方法 | 參數 | 描述 |
---|---|---|
createResource |
|
呼叫方法的使用者必須具備名為 ". Resources" 之啟動安裝資源的 CREATE 存取權。不允許重複指定的資源。
|
getResource |
|
呼叫方法的使用者必須具備資源的 READ 存取權 |
deleteResource |
|
呼叫方法的使用者必須具備具名資源的 DELETE 存取權 |
addAfterACLInResource |
|
呼叫方法的使用者必須具備此資源的 UPDATE 存取權 |
addBeforeACLInResource |
|
呼叫方法的使用者必須具備此資源的 UPDATE 存取權 |
updateDescriptionInResource |
|
呼叫方法的使用者必須具備此資源的 UPDATE 存取權 |
removeBindACLInResource |
|
呼叫方法的使用者必須具備此資源的 UPDATE 存取權 |
checkResourceAccess |
|
檢查呼叫方法的目前使用者是否具有指定的指定資源存取權。 |