Fine-Grained Access Control Marbles 示例
大理石链码应用程序允许您创建具有独特属性(名称,大小,颜色和所有者)的资产(大理石),并与区块链网络中的其他参与者交易这些资产。
此示例应用程序包括各种函数,以便您检查如何使用访问控制列表和组来将函数限制为特定用户。
示例概览
为了管理资产,示例中包含的测试方案包含以下限制:
- 只有具有
"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"})
先决条件和设置
要运行大理石样本的细粒度访问控制版本,请完成以下步骤:
- 下载大理石样品的细粒度访问控制版本。在 Developer Tools(开发人员工具)选项卡中,打开 Samples(示例)窗格,然后单击 Marbles with Fine-Grained ACLs(带细粒度 ACL 的大理石)下的下载链接。提取此程序包 - 它包含大理石示例 (
fgACL_MarbleSampleCC.zip
)、运行示例的 Node.js 文件 (fgACL-NodeJSCode.zip
) 和细粒度访问控制库 (Fine-GrainedAccessControlLibrary.zip
) 的 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 :生成将部署到区块链平台的链代码程序包:
- 安装 govendor:
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
目录)。您的链代码已准备好部署到区块链平台。
- 安装 govendor:
- 按使用快速部署中所述安装和部署更新的链代码软件包样例 (
fgACL_MarbleSampleCC.zip
)。 - 在开发人员工具选项卡上,打开应用程序开发窗格,然后按照说明下载 Node.js SDK。
- 在开发人员工具选项卡上,打开应用程序开发窗格,然后单击下载开发包。
- 使用随示例下载的 Node.js 文件将开发包提取到同一个文件夹中。
- 在
network.yaml
文件中,查找certificateAuthorities
条目及其registrar
条目。下载后,管理员的密码会在network.yaml
中被屏蔽(转换为***
)。运行此示例时,应将其替换为管理员的明文口令。
- 向您的区块链平台实例注册新身份:
- 在映射到租户的 IDCS 中,在 IDCS 中创建新用户(在以下步骤中称为
<NewIdentity>
)。 - 为此用户指定实例的
CA_User
应用程序角色。
- 在映射到租户的 IDCS 中,在 IDCS 中创建新用户(在以下步骤中称为
实施细粒度访问控制大理石样本
以下步骤将注册新用户并使用提供的 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
- 创建测试大理石资源:这会创建多个测试大理石资产 - Tom 拥有 blue1 和 blue2,jerry 拥有 red1 和 red2,spike 拥有 green1 和 green2。
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
- 以管理用户身份删除大理石:
deleteMarbleAcl
ACL 应阻止此删除,因为管理标识没有必需的"deleteMarblePermission=true"
Fabric 属性。node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
示例文件引用
这些表列出了示例中包含的链代码和应用程序文件中可用的方法。
fgMarbles_chaincode.go
函数 | 说明 |
---|---|
initMarble |
创建新大理石 |
transferMarble |
根据名称将大理石从一个所有者转移到另一个所有者 |
createTestMarbles |
调用 initMarble 创建用于测试的新样例大理石
|
createFineGrainedAclSampleResources |
创建测试方案所需的细粒度访问控制列表 (access control list,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 |
|
检查调用该方法的当前用户是否具有对指定资源的指定访问权限。 |