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"})

先决条件和设置

要运行大理石样本的细粒度访问控制版本,请完成以下步骤:

  1. 下载大理石样品的细粒度访问控制版本。在 Developer Tools(开发人员工具)选项卡中,打开 Samples(示例)窗格,然后单击 Marbles with Fine-Grained ACLs(带细粒度 ACL 的大理石)下的下载链接。提取此程序包 - 它包含大理石示例 (fgACL_MarbleSampleCC.zip)、运行示例的 Node.js 文件 (fgACL-NodeJSCode.zip) 和细粒度访问控制库 (Fine-GrainedAccessControlLibrary.zip) 的 ZIP 文件。
  2. 仅限 Hyperledger Fabric v2.x :生成将部署到区块链平台的链代码程序包:
    • 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. 仅限 Hyperledger Fabric v1.4.7 :生成将部署到区块链平台的链代码程序包:
    • 安装 govendor:
      go get -u github.com/kardianos/govendor
    • fgACL_MarbleSampleCC.zip 的内容提取到 fgACL_MarbleSampleCC 目录。fgACL_MarbleSampleCC 目录的内容为:fgACL_Operations.gofgGroups_Operations.gofgMarbles_chaincode.go fgResource_Operations.govendor 目录。
    • 从命令行转到 fgACL_MarbleSampleCC 目录,然后运行 govendor sync。这将下载所需的依赖项 (github.com/op/go-logging) 并将其添加到 vendor 目录。
    • 以 ZIP 格式压缩 fgACL_MarbleSampleCC 目录的所有内容(四个 Go 文件和 vendor 目录)。您的链代码已准备好部署到区块链平台。
  4. 使用快速部署中所述安装和部署更新的链代码软件包样例 (fgACL_MarbleSampleCC.zip)。
  5. 开发人员工具选项卡上,打开应用程序开发窗格,然后按照说明下载 Node.js SDK。
  6. 开发人员工具选项卡上,打开应用程序开发窗格,然后单击下载开发包
    1. 使用随示例下载的 Node.js 文件将开发包提取到同一个文件夹中。
    2. network.yaml 文件中,查找 certificateAuthorities 条目及其 registrar 条目。下载后,管理员的密码会在 network.yaml 中被屏蔽(转换为 ***)。运行此示例时,应将其替换为管理员的明文口令。
  7. 向您的区块链平台实例注册新身份:
    1. 在映射到租户的 IDCS 中,在 IDCS 中创建新用户(在以下步骤中称为 <NewIdentity>)。
    2. 为此用户指定实例的 CA_User 应用程序角色。

实施细粒度访问控制大理石样本

以下步骤将注册新用户并使用提供的 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. 创建测试大理石资源:这会创建多个测试大理石资产 - Tom 拥有 blue1 和 blue2,jerry 拥有 red1 和 red2,spike 拥有 green1 和 green2。
    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 传输到 spike。由于对谁可以转移单个大理石没有限制,这也应该成功完成。
    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 创建测试方案所需的细粒度访问控制列表 (access control list,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
检查调用该方法的当前用户是否具有对指定资源的指定访问权限。