细粒度访问控制大理石样本
大理石链代码应用程序允许您创建具有独特属性(名称,大小,颜色和所有者)的资产(大理石),并与区块链网络中的其他参与者进行交易。
此示例应用程序包含各种函数,可用于检查如何处理访问控制列表和组,以将函数限制为特定用户。
示例概览
样本中包含的测试方案包含以下限制,以便管理资产:
- 只有具有
"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
) 的 ZIP 文件、用于运行样例 (fgACL-NodeJSCode.zip
) 的 Node.js 文件以及细粒度访问控制库 (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
目录)。您的链代码已准备好部署到区块链平台。
- 将
- 按 Use Quick Deployment 中所述安装和部署更新的示例链代码软件包 (
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 |
创建测试方案所需的细粒度访问控制列表 (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 |
|
检查调用该方法的当前用户是否具有对指定资源的指定访问权限。 |