阅读本文章前建议先了解《使用VS Code开发智能合约》
ABAC是什么?
ABAC的全称是Attribute-based access control 具体可以参考wiki中的定义。https://en.wikipedia.org/wiki/Attribute-based_access_control
简单点说,这是一种访问控制模型,通过对访问主体的属性标注,结合规则来实现访问控制的目的。通常分为两个步骤:
- 先对访问控制主体打标。例如:性别:男,职位:主管
- 然后基于规则控制。例如:某管理接口,需要 职位 > 主管 的人才可访问
Fabric中的abac又是怎么回事呢?
Fabric中是使用PKI机制作为身份管理手段的。在很早的版本中就加入了对ABAC的支持(https://jira.hyperledger.org/browse/FABC-539)。在Fabric中,我们要使用ABAC,也分为两个步骤。
对访问控制的主体打标。在Fabric中,我们通过Fabric CA的身份管理接口实现对身份的打标,后续该身份enroll的证书会带上相应的属性标记。可以参考以下官方文档:
在智能合约中,我们通过解析身份证书中的属性,再按照我们设定的规则,实现ABAC。Fabric也有相关的文档来指导我们如何在chaincode中使用这部分功能:
在VS Code中实现ABAC功能
通过create identity创建带属性的身份证书。
- 为身份取名:abac_test
- 是否创建属性:Yes
- 设定属性(ecert一定要为true):[{"name": "viplevel", "value": "5", "ecert": true}]
创建完的身份可以看到对应的属性
在链码中设定访问控制逻辑
我们可以插入如下代码到delete函数逻辑中。
val, ok, err := cid.GetAttributeValue(stub, "viplevel")
if err != nil {
return shim.Error("Failed to GetAttributeValue")
}
if !ok {
return shim.Error("Failed to GetAttributeValue")
}
if val != "5" {
return shim.Error("Only viplevel 5 are allowed to delete!")
}
注意:在单机模式下,我们只需要启动debug就能让开发中的代码生效,无需升级链码。
使用不同的身份访问提交delete请求
我们可以在FABRIC GATEWAYS这里通过断开连接再重新连接的方式,切换连接身份。我们可以看到,使用abac_test可以成功执行删除功能。而使用之前的admin角色账号,删除出错。自此我们就实现了基于ABAC的访问控制。
在阿里云BaaS平台上使用ABAC功能
ABAC中关键的给用户打标功能我们可以通过阿里云BaaS控制台来做到。在BaaS控制台中创建用户一栏,选择高级,在属性集中设置所需的kv对,即可创建带属性的账号。
此外,阿里云BaaS还提供了配套插件,使用此插件可以方便的将链码部署到云上。同时也提供了connection-profile下载等其他功能,IBM Blockchain Platform插件的gateway、wallet也可以连接到阿里云BaaS的Fabric,让你对直接对云上的区块链实例发起交易。
联系我们
欢迎感兴趣的同学加入钉钉群(钉钉群号: 23181816)。