微點存取控制 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"})
先決條件與設定
若要執行大理石範例的微點存取控制版本,請完成下列步驟:
- 下載微點存取控制版本的 Marbles 範例。在開發人員工具頁籤上,開啟範例窗格,然後按一下微點 ACL 大理石下的下載連結。擷取此套裝程式 - 它包含大理石範例 (
fgACL_MarbleSampleCC.zip
) 的 ZIP 檔案、執行範例的 Node.js 檔案 (fgACL-NodeJSCode.zip
) 以及微點存取控制程式庫 (Fine-GrainedAccessControlLibrary.zip
)。 - 僅限 Hyperledger Fabric v2.x :產生將部署至區塊鏈平台的鏈碼套件:
- 將
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
目錄)。您的鏈碼已準備好部署到區塊鏈平台。
- 將
- 僅限 Hyperledger Fabric v1.4.7 :產生將部署至區塊鏈平台的鏈碼套件:
- 安裝協力廠商:
go get -u github.com/kardianos/govendor
- 將
fgACL_MarbleSampleCC.zip
的內容擷取至fgACL_MarbleSampleCC
目錄。fgACL_MarbleSampleCC
目錄的內容為:fgACL_Operations.go
、fgGroups_Operations.go
、fgMarbles_chaincode.go
、fgResource_Operations.go
以及vendor
目錄。 - 從命令行移至
fgACL_MarbleSampleCC
目錄,然後執行govendor sync
。這會下載必要的相依性 (github.com/op/go-logging
),並將其新增至vendor
目錄。 - 以 ZIP 格式壓縮
fgACL_MarbleSampleCC
目錄的所有內容 (四個 Go 檔案和vendor
目錄)。您的鏈碼已準備好部署到區塊鏈平台。
- 安裝協力廠商:
- 如使用快速部署中所述,安裝並部署更新的連鎖程式碼套裝程式 (
fgACL_MarbleSampleCC.zip
)。 - 在開發人員工具頁籤中,開啟應用程式開發窗格,然後依照指示下載 Node.js SDK。
- 在開發人員工具頁籤中,開啟應用程式開發窗格,然後按一下下載開發套件。
- 使用隨範例下載的 Node.js 檔案,將開發套件擷取至相同的資料夾。
- 在
network.yaml
檔案中,尋找certificateAuthorities
項目及其registrar
項目。下載network.yaml
時,會遮罩管理員的密碼 (轉換成***
)。執行此範例時,應以管理員的純文字密碼取代。
- 在您的區塊鏈平台執行處理註冊新身分識別:
- 在對應至您租用戶的 IDCS 中,在 IDCS 中建立新使用者 (在下列步驟中稱為
<NewIdentity>
)。 - 為此使用者提供執行處理的
CA_User
應用程式角色。
- 在對應至您租用戶的 IDCS 中,在 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 傳輸至 spike。由於沒有可以傳輸單一大理石的人員限制,因此也應該順利完成。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
- 以管理使用者的身分刪除大理石:由於管理識別沒有必要的
"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 |
|
取得具名 ACL 或讀取所有 ACL。呼叫方法的使用者必須具有具名 ACL 的 READ 存取權。 |
createACL |
|
若要建立新的 ACL,呼叫方法的使用者必須具備 CREATE 存取名為 ". ACLs" 的啟動安裝資源。不允許重複的具名 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= 呼叫方法的使用者必須具有此群組的「讀取」存取權。 |
createGroup |
|
傳回 呼叫方法的使用者必須具備啟動安裝群組 |
deleteGroup |
|
呼叫方法的使用者必須具有此群組的 DELETE 存取權。 |
addAfterGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
addBeforeGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
updateDescriptionForGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
removeBindAclFromGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
addMembersToGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
removeMembersFromGroup |
|
呼叫方法的使用者必須具有此群組的 UPDATE 存取權。 |
fgResource_Operations.go
方法 | 參數 | 描述 |
---|---|---|
createResource |
|
呼叫方法的使用者需要有 CREATE 存取名為 ". Resources" 的啟動安裝資源。不允許重複的指定資源。
|
getResource |
|
呼叫方法的使用者必須具有資源的讀取存取權 |
deleteResource |
|
呼叫方法的使用者必須具有具名資源的 DELETE 存取權 |
addAfterACLInResource |
|
呼叫方法的使用者必須具有此資源的 UPDATE 存取權 |
addBeforeACLInResource |
|
呼叫方法的使用者必須具有此資源的 UPDATE 存取權 |
updateDescriptionInResource |
|
呼叫方法的使用者必須具有此資源的 UPDATE 存取權 |
removeBindACLInResource |
|
呼叫方法的使用者必須具有此資源的 UPDATE 存取權 |
checkResourceAccess |
|
檢查目前呼叫方法的使用者是否具有指定資源的存取權。 |