|
| 1 | +# 行级权限控制规则 |
| 2 | +说明: |
| 3 | +1. 由于加密表在共识阶段Raw字段是无法解密的,无法判断行级控制条件的合法性,所以不同时支持加密表与行级控制功能 |
| 4 | + |
| 5 | +## 设计原则 |
| 6 | +1. 灵活 可以单独使用某种规则,也可以自由组合使用 |
| 7 | +2. 精细 可精确到控制每一行的增删改查规则,可控制插入条数、可修改字段 |
| 8 | + |
| 9 | +## 建表时指定增删改规则 |
| 10 | +TableListSet的交易中添加一个新的字段**OperateRule**,示例如下: |
| 11 | +``` |
| 12 | +{ |
| 13 | + "OperationRule":{ |
| 14 | + "Insert":{ |
| 15 | + "Condition":{"account":"$account","txid":"$tx_hash"}, |
| 16 | + "Count":{"AccountField":"account","CountLimit":5} |
| 17 | + }, |
| 18 | + "Update":{ |
| 19 | + "Condition":{"$or":[{"age":{"$le":28}},{"id":2}]}, |
| 20 | + "Fields":["age"] |
| 21 | + }, |
| 22 | + "Delete":{ |
| 23 | + "Condition":{"account":"$account"} |
| 24 | + }, |
| 25 | + "Get":{ |
| 26 | + "Condition":{"id":{"$ge":3}} |
| 27 | + } |
| 28 | + } |
| 29 | +} |
| 30 | +``` |
| 31 | +完整的建表交易: |
| 32 | +``` |
| 33 | +{ |
| 34 | + "method": "t_create", |
| 35 | + "params": [ |
| 36 | + { |
| 37 | + "offline": false, |
| 38 | + "secret": "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", |
| 39 | + "tx_json": { |
| 40 | + "TransactionType": "TableListSet", |
| 41 | + "Account": "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", |
| 42 | + "Tables":[ |
| 43 | + { |
| 44 | + "Table":{ |
| 45 | + "TableName":"tableWithRule" |
| 46 | + } |
| 47 | + } |
| 48 | + ], |
| 49 | + "OpType": 1, |
| 50 | + "Raw": [ |
| 51 | + {"field":"id","type":"int","length":11,"PK":1,"NN":1,"UQ":1,"AI":1}, |
| 52 | + {"field":"age","type":"int"}, |
| 53 | + {"field":"name","type":"varchar","length":32}, |
| 54 | + {"field":"account","type":"varchar","length":64}, |
| 55 | + {"field":"txid","type":"varchar","length":64} |
| 56 | + ], |
| 57 | + "OperationRule":{ |
| 58 | + "Insert":{ |
| 59 | + "Condition":{"account":"$account","txid":"$tx_hash"}, |
| 60 | + "Count":{"AccountField":"account","CountLimit":5} |
| 61 | + }, |
| 62 | + "Update":{ |
| 63 | + "Condition":{"$or":[{"age":{"$le":28}},{"id":2}]}, |
| 64 | + "Fields":["age"] |
| 65 | + }, |
| 66 | + "Delete":{ |
| 67 | + "Condition":{"account":"$account"} |
| 68 | + }, |
| 69 | + "Get":{ |
| 70 | + "Condition":{"id":{"$ge":3}} |
| 71 | + } |
| 72 | + } |
| 73 | + } |
| 74 | + } |
| 75 | + ] |
| 76 | +} |
| 77 | +``` |
| 78 | +## 详细说明: |
| 79 | +### Insert |
| 80 | +Insert中可设置Condition与Count两个字段的值:<br> |
| 81 | +**Condition** |
| 82 | +<br>指定插入操作可设置的默认值<br> |
| 83 | +如: |
| 84 | +``` |
| 85 | +{'field1':0} |
| 86 | +``` |
| 87 | +表示field1的默认值为0<br> |
| 88 | +有两个特殊的表示: |
| 89 | +``` |
| 90 | +{'field2':$account} |
| 91 | +``` |
| 92 | +表示field2的默认值为当前执行插入操作的账户地址 |
| 93 | +``` |
| 94 | +{'field3':$tx_hash} |
| 95 | +``` |
| 96 | +表示field3的默认值为当前插入交易的hash值<br> |
| 97 | + |
| 98 | + |
| 99 | +**Count**<br> |
| 100 | +Count 可以限制每个账户可以插入的记录数<br> |
| 101 | +``` |
| 102 | +{ |
| 103 | + "Count":{"AccountField":"fieldName","CountLimit":10} |
| 104 | +} |
| 105 | +``` |
| 106 | +以上条件中<br> |
| 107 | +AccountField指定建表字段中哪个字段为账户字段<br> |
| 108 | +CountLimit表示每个账户可插入几行(这里说的账户指的是AccountField指定的账户字段的值) |
| 109 | + |
| 110 | +**注**: |
| 111 | +1. 如果指定了默认值,插入时又指定了其它值,插入交易会执行失败<br> |
| 112 | +2. Insert中Condition与Count可同时使用,也可以只指定一个 |
| 113 | + - 只指定Condition:指定一些字段的默认值 |
| 114 | + - 只指定Count:这种情况下,插入者可以指定账户字段的值为其它账户,但是每个账户相关的记录还是会受条数限制影响。 |
| 115 | + |
| 116 | +### Update |
| 117 | +Update条件示例如下: |
| 118 | +``` |
| 119 | +{ |
| 120 | + "Condition":{"$or":[{"field2":{"$le":8}},{"field3":10}]}, |
| 121 | + "Fields":["field1","field2"] |
| 122 | +} |
| 123 | +``` |
| 124 | +**Condition**:<br> |
| 125 | +指定更新操作的条件,这个条件会在执行真正的更新交易时与更新交易的条件做‘and’操作,如:<br>执行下面的更新操作,将id=1的记录中的age的值更新为11: |
| 126 | +``` |
| 127 | +{ |
| 128 | + "method":"r_update", |
| 129 | + "params":[ |
| 130 | + { |
| 131 | + "offline":false, |
| 132 | + "secret":"xxWFBu6veVgMnAqNf6YFRV2UENRd3", |
| 133 | + "tx_json":{ |
| 134 | + "TransactionType":"SQLStatement", |
| 135 | + "Account":"z9VF7yQPLcKgUoHwMbzmQBjvPsyMy19ubs", |
| 136 | + "Owner":"zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", |
| 137 | + "Tables":[ |
| 138 | + { |
| 139 | + "Table":{ |
| 140 | + "TableName":"tableWithRule" |
| 141 | + } |
| 142 | + } |
| 143 | + ], |
| 144 | + "Raw":[ |
| 145 | + {"age":11}, |
| 146 | + {"id":1} |
| 147 | + ], |
| 148 | + "OpType":8 |
| 149 | + } |
| 150 | + } |
| 151 | + ] |
| 152 | +} |
| 153 | +``` |
| 154 | +结合行级控制里面的Update条件,最终的Raw字段会取值如下: |
| 155 | +``` |
| 156 | +{ |
| 157 | + "Raw":[ |
| 158 | + { |
| 159 | + "age":11 |
| 160 | + }, |
| 161 | + { |
| 162 | + "$and":[ |
| 163 | + { |
| 164 | + "id":1 |
| 165 | + }, |
| 166 | + { |
| 167 | + "$or":[ |
| 168 | + { |
| 169 | + "field2":{"$le":8} |
| 170 | + }, |
| 171 | + { |
| 172 | + "field3":10 |
| 173 | + } |
| 174 | + ] |
| 175 | + } |
| 176 | + ] |
| 177 | + } |
| 178 | + ] |
| 179 | +} |
| 180 | +``` |
| 181 | +**Fields**<br> |
| 182 | +Fields指定了更新操作所能更新的字段,如果不添加Fields条件,默认可以更新表中所有字段<br> |
| 183 | +需要注意的是:<br> |
| 184 | +> 如Insert条件中某个字段在Count条件中被指定为账户字段,那这个字段是一定不能出现在Update条件的Fields中的,这种条件下必须显式的在Fields中将账户字段排除出去,否则会报**temBAD_OPERATIONRULE**错误 |
| 185 | +
|
| 186 | +## Delete/Get |
| 187 | +Delete与Get操作只有Condition条件.<br> |
| 188 | +> 如Insert条件中某个字段在Count条件中被指定为账户字段,删除的Condition中必须显示指定操作账户字段为本账户字段: |
| 189 | +``` |
| 190 | +{ |
| 191 | + "Condition":{"account":"$account"} |
| 192 | +} |
| 193 | +``` |
| 194 | + |
| 195 | + |
| 196 | + |
| 197 | + |
| 198 | + |
0 commit comments