You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

user.md 4.7 kB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. ## 用户
  2. `JD Chain`实现了基于角色和权限的用户账户管理体系。
  3. ### 1. 用户
  4. 可类比传统数据库的用户概念,`JD Chain`用户是接入`JD Chain`网络的必要身份,本质上由一对公私钥对标识,公钥和地址信息记录在账本用户数据集中。
  5. ### 2. 角色
  6. 角色名称不区分大小写,最长不超过20个字符,多个角色名称之间用半角的逗点`,`分隔
  7. 系统会预置一个默认角色`DEFAULT`,所有未指定角色的用户都以赋予该角色的权限,若初始化时未配置默认角色的权限,则为默认角色分配所有权限;
  8. #### 2.1 多角色策略
  9. 表示如何处理一个对象被赋予多个角色时的综合权限,在`RolesPolicy`枚举中定义:
  10. ```java
  11. public enum RolesPolicy {
  12. // 合并权限,综合权限是所有角色权限的并集,即任何一个角色的权限都被继承
  13. UNION((byte) 0),
  14. // 交叉权限,综合权限是所有角色权限的交集,即只有全部角色共同拥有的权限才会被继承
  15. INTERSECT((byte) 1);
  16. }
  17. ```
  18. ### 3. 权限
  19. `JD Chain`权限设计分为两类:账本权限,交易权限。
  20. #### 3.1 账本权限
  21. 账本相关的权限,这些权限属于全局性的
  22. - `CONFIGURE_ROLES`配置角色
  23. - `AUTHORIZE_USER_ROLES`授权用户角色
  24. - SET_CONSENSUS 设置共识协议
  25. - SET_CRYPTO 设置密码体系
  26. - `APPROVE_TX`参与方核准交易,如果不具备此项权限,则无法作为节点签署由终端提交的交易
  27. - `CONSENSUS_TX`参与方共识交易
  28. - `REGISTER_PARTICIPANT`注册参与方
  29. - SET_USER_ATTRIBUTES 设置用户属性
  30. - `REGISTER_USER`注册用户
  31. - `REGISTER_EVENT_ACCOUNT`注册事件账户
  32. - `WRITE_EVENT_ACCOUNT`发布事件
  33. - `REGISTER_DATA_ACCOUNT`注册数据账户
  34. - `WRITE_DATA_ACCOUNT`写入数据账户
  35. - `REGISTER_CONTRACT`注册合约
  36. - `UPGRADE_CONTRACT`升级合约
  37. #### 3.2 交易权限
  38. 一个用户可以发起的交易类型
  39. - `DIRECT_OPERATION`交易中包含指令操作
  40. - `CONTRACT_OPERATION`交易中包含合约操作
  41. ### 4. 控制逻辑
  42. `JD Chain`[交易](transaction.md)执行前会验证交易的签名信息,签名主要包含**节点签名**和**终端用户签名**。
  43. #### 4.1 节点身份验证
  44. > 网关提交交易前,会使用网关配置文件中配置的公私钥信息所代表的节点用户,自动添加签名到节点签名列表中。
  45. `JD Chain`运行时网络执行交易前,要求节点签名用户至少有一个具有`LedgerPermission.APPROVE_TX`权限。
  46. #### 4.2 终端用户验证
  47. 提交交易前,要求添加终端用户签名信息。
  48. 执行到具体操作前会校验相应账本/交易权限,策略都是至少有一个终端用户包含操作权限。
  49. 例如:创建用户账户操作执行前会校验所有终端用户签名中的用户**至少有一个**包含`LedgerPermission.REGISTER_USER`权限。
  50. ### 5. SDK
  51. 可在`ledger.init`中配置好角色权限,在组网成功后所配置的角色和权限信息会写入到相关账本中。
  52. 也可以通过以下相关`SDK`代码向运行中`JD Chain`网络执行用户相关操作:
  53. #### 5.1 注册用户
  54. 默认使用`ed25519`编码
  55. 创建公私钥对:
  56. ```java
  57. BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate();
  58. ```
  59. 从已存在的公私钥恢复:
  60. ```java
  61. PubKey pubKey = KeyGenUtils.decodePubKey("7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq");
  62. PrivKey privKey = KeyGenUtils.decodePrivKey("177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x", "DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY");
  63. BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey);
  64. ```
  65. 注册用户:
  66. ```java
  67. TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
  68. txTemp.users().register(user.getIdentity());
  69. ```
  70. #### 5.2 创建角色
  71. ```java
  72. TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
  73. // 创建角色 MANAGER ,并设置可以写数据账户,能执行交易
  74. txTemp.security().roles().configure("MANAGER")
  75. .enable(LedgerPermission.WRITE_DATA_ACCOUNT)
  76. .disable(LedgerPermission.REGISTER_USER)
  77. .enable(TransactionPermission.DIRECT_OPERATION);
  78. ```
  79. #### 5.3 用户赋权
  80. ```java
  81. TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
  82. // 给用户设置 MANAGER 角色权限
  83. txTemp.security().authorziations().forUser(Bytes.fromBase58("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye")).authorize("MANAGER").unauthorize("DEFAULT").setPolicy(RolesPolicy.UNION);
  84. // 或者
  85. txTemp.security().authorziations().forUser(user.getIdentity()).authorize("MANAGER").unauthorize("DEFAULT").setPolicy(RolesPolicy.UNION);
  86. ```