Skip to content

Latest commit

 

History

History
138 lines (93 loc) · 4.85 KB

File metadata and controls

138 lines (93 loc) · 4.85 KB

JD Chain实现了基于角色和权限的用户账户管理体系。

可类比传统数据库的用户概念,JD Chain用户是接入JD Chain网络的必要身份,本质上由一对公私钥对标识,公钥和地址信息记录在账本用户数据集中。

角色

角色名称不区分大小写,最长不超过20个字符,多个角色名称之间用半角的逗点,分隔

系统会预置一个默认角色DEFAULT,所有未指定角色的用户都以赋予该角色的权限,若初始化时未配置默认角色的权限,则为默认角色分配所有权限;

多角色策略

表示如何处理一个对象被赋予多个角色时的综合权限,在RolesPolicy枚举中定义:

public enum RolesPolicy {

	// 合并权限,综合权限是所有角色权限的并集,即任何一个角色的权限都被继承
	UNION((byte) 0),

	// 交叉权限,综合权限是所有角色权限的交集,即只有全部角色共同拥有的权限才会被继承
	INTERSECT((byte) 1);
}

权限

JD Chain权限设计分为两类:账本权限,交易权限。

账本权限

账本相关的权限,这些权限属于全局性的

  • CONFIGURE_ROLES配置角色
  • AUTHORIZE_USER_ROLES授权用户角色
  • APPROVE_TX参与方核准交易,如果不具备此项权限,则无法作为节点签署由终端提交的交易
  • SET_CONSENSUS 更新共识
  • SET_CRYPTO 更新密码算法
  • REGISTER_PARTICIPANT注册参与方
  • REGISTER_USER注册用户
  • REGISTER_EVENT_ACCOUNT注册事件账户
  • WRITE_EVENT_ACCOUNT发布事件
  • REGISTER_DATA_ACCOUNT注册数据账户
  • WRITE_DATA_ACCOUNT写入数据账户
  • UPGRADE_CONTRACT部署、更新合约
  • UPDATE_USER_STATE更新用户(证书)状态
  • UPDATE_ROOT_CA更新账本根证书
  • UPDATE_USER_CA更新用户(证书)状态
  • UPDATE_CONTRACT_STATE更新合约状态

交易权限

一个用户可以发起的交易类型

  • DIRECT_OPERATION交易中包含指令操作
  • CONTRACT_OPERATION交易中包含合约操作

控制逻辑

JD Chain交易执行前会验证交易的签名信息,签名主要包含节点签名终端用户签名

节点身份验证

网关提交交易前,会使用网关配置文件中配置的公私钥信息所代表的节点用户,自动添加签名到节点签名列表中。

JD Chain运行时网络执行交易前,要求节点签名用户至少有一个具有LedgerPermission.APPROVE_TX权限。

终端用户验证

提交交易前,要求添加终端用户签名信息。

执行到具体操作前会校验相应账本/交易权限,策略都是至少有一个终端用户包含操作权限。

例如:创建用户账户操作执行前会校验所有终端用户签名中的用户至少有一个包含LedgerPermission.REGISTER_USER权限。

SDK

可在ledger.init中配置好角色权限,在组网成功后所配置的角色和权限信息会写入到相关账本中。 也可以通过以下相关SDK代码向运行中JD Chain网络执行用户相关操作:

注册用户

默认使用ed25519编码

创建公私钥对:

BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate();

从已存在的公私钥恢复:

PubKey pubKey = KeyGenUtils.decodePubKey("7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq");
PrivKey privKey = KeyGenUtils.decodePrivKey("177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x", "DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY");
BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey);

角色赋权

TransactionTemplate txTemp = blockchainService.newTransaction(ledger);

// 创建角色 MANAGER ,并设置可以写数据账户,能执行交易
txTemp.security().roles().configure("MANAGER")
        .enable(LedgerPermission.WRITE_DATA_ACCOUNT)
        .enable(TransactionPermission.DIRECT_OPERATION);

PreparedTransaction ptx = txTemp.prepare();
ptx.sign(adminKey);
TransactionResponse response = ptx.commit();

用户赋权

TransactionTemplate txTemp = blockchainService.newTransaction(ledger);

// 赋予用户 user MANAGER 角色,取消 ADMIN 角色,设置多角色策略策略为合并策略
txTemp.security().authorziations().forUser(user.getAddress()).authorize("MANAGER").unauthorize("ADMIN").setPolicy(RolesPolicy.UNION);

PreparedTransaction ptx = txTemp.prepare();
ptx.sign(adminKey);
TransactionResponse response = ptx.commit();

用户状态

TransactionTemplate txTemp = blockchainService.newTransaction(ledger);

// 用户(证书)状态分为:NORMAL(正常) FREEZE(冻结) REVOKE(销毁)
// 冻结用户(证书)
txTemp.user("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye").state(AccountState.FREEZE);

PreparedTransaction ptx = txTemp.prepare();
ptx.sign(adminKey);
TransactionResponse response = ptx.commit();