用户访问控制

基于属性的访问控制

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

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

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

属性集设置

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

  1. 登录阿里云BaaS控制台

  2. 概览页面,找到我的组织区域,找到目标组织,单击组织的名称。

  3. 单击用户标签页。

  4. 单击新增用户,在弹框中打开高级,即可设置用户的属性集。

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

    user

属性集设置规范:

  • 使用逗号(,)分割为不同的属性

  • 等号(=)前为属性名称, 等号(=)后为该属性的值

  • 属性名称及属性值必须由英文字母或数字组成

  • 属性名称及属性值均为字符串类型

示例:

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

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

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

链码中获取用户属性

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

id, err := cid.New(stub)

fmt.Println("client ID object:")
fmt.Println(id)
if err != nil {
    return shim.Error(err.Error())
}
val, ok, err = cid.GetAttributeValue(stub, "permissions")
if err != nil {
    return shim.Error(err.Error())
}

if !ok {
    return shim.Error("The client identity does not possess the attribute:permissions")
}

err := cid.AssertAttributeValue(stub, "permissions", "7")
if err != nil {
   return shim.Error("The client identity does not have the permissions")
}

fmt.Println("permissions:")
fmt.Println(val)