基于属性的访问控制
Hyperledger Fabric 支持使用基于属性的访问控制(ABAC, Attribute-Based Access Control)来控制用户的访问权限。在进行用户的身份注册时,登录证书(ECert)可以包含一个或多个属性名称和值,链码运行时可以提取属性值来进行访问控制决策。
例如,您正在开发一个名为 app1 的应用,只有 app1 的管理员才可以访问一个特定的 chaincode 操作。您的 chaincode 可以根据调用者的证书中是否包含的 app1Admin 属性以及该属性值是否为 “true” 来决定是否允许访问。
关于 Hyperledger Fabric ABAC 功能,更多请参见 Attribute-Based Access Control。
属性集设置
您可以在控制台创建组织用户时,打开高级,设置用户的属性集,用于控制用户的访问权限。
登录阿里云BaaS控制台。
在概览页面,找到我的组织区域,找到目标组织,单击组织的名称。
单击用户标签页。
单击新增用户,在弹框中打开高级,即可设置用户的属性集。
创建用户后,可以看到用户相关的属性集。
属性集设置规范:
使用逗号(,)分割为不同的属性
等号(=)前为属性名称, 等号(=)后为该属性的值
属性名称及属性值必须由英文字母或数字组成
属性名称及属性值均为字符串类型
示例:
属性集内容:app1Admin=true,permissions=7
在用户的登录证书中,其属性值为:
{"attrs":{"app1Admin":"true","permissions":"7","hf.Affiliation":"","hf.EnrollmentID":"abacUser1","hf.Type":"client"}}
其中,hf.EnrollmentID
、hf.Type
、hf.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)
文档内容是否对您有帮助?