全部产品
Search
文档中心

用户访问控制

更新时间: 2021-01-11

基于属性的访问控制

Hyperledger Fabric 支持使用基于属性的访问控制(ABAC, Attribute-Based Access Control)来控制用户的访问权限。在进行用户的身份注册时,登录证书(ECert)可以包含一个或多个属性名称和值,链码运行时可以提取属性值来进行访问控制决策。

例如,您正在开发一个名为 app1 的应用,只有 app1 的管理员才可以访问一个特定的 chaincode 操作。您的 chaincode 可以根据调用者的证书中是否包含的 app1Admin 属性以及该属性值是否为 “true” 来决定是否允许访问。

关于 Hyperledger Fabric ABAC 功能,更多请参见 Attribute-Based Access Control

属性集设置

您可以在控制台创建组织用户时,打开高级,设置用户的属性集,用于控制用户的访问权限。

abac

创建用户后,可以看到用户相关的属性集

user

属性集设置规范:

  • 使用逗号(,)分割为不同的属性
  • 等号(=)前为属性名称, 等号(=)后为该属性的值
  • 属性名称及属性值必须由英文字母或数字组成
  • 属性名称及属性值均为字符串类型

示例:

属性集内容:app1Admin=true,permissions=7在用户的登录证书中,其属性值为:

  1. {"attrs":{"app1Admin":"true","permissions":"7","hf.Affiliation":"","hf.EnrollmentID":"abacUser1","hf.Type":"client"}}

其中,hf.EnrollmentIDhf.Typehf.Affiliation为每个身份自动注册的三个属性。

链码中获取用户属性

详细开发文档请参考:chaincode/shim/ext/cid

  1. id, err := cid.New(stub)
  2. fmt.Println("client ID object:")
  3. fmt.Println(id)
  4. if err != nil {
  5. return shim.Error(err.Error())
  6. }
  7. val, ok, err = cid.GetAttributeValue(stub, "permissions")
  8. if err != nil {
  9. return shim.Error(err.Error())
  10. }
  11. if !ok {
  12. return shim.Error("The client identity does not possess the attribute:permissions")
  13. }
  14. err := cid.AssertAttributeValue(stub, "permissions", "7")
  15. if err != nil {
  16. return shim.Error("The client identity does not have the permissions")
  17. }
  18. fmt.Println("permissions:")
  19. fmt.Println(val)