Doris行权限原理
Doris支持了行级数据权限,当多租户模式使用的是共享表模式的情况下该功能能很方便的帮用户数实现行级权限控制。
Doris的行级权限是通过安全策略(ROW POLICY)实现的。
具体做法为:用户在指定表上创建安全策略并授权到具体的用户,当用户查询数据的时候查询规划会对SQL进行改写,将用户的安全策略注入到SQL中,改写后的SQL会携带用户的行权限。以实现多用户的数据行级权限控制。
(1)设置ROW POLICY:
在表test.table1 上创建一个名称为test_row_policy_1的ROW POLICY,并将POLICY绑定在用户test_user上。POLICY策略为:tenantid = ‘a’
CREATE ROW POLICY test_row_policy_1 ON test.table1
AS RESTRICTIVE TO test_user USING (tenantid = 'a');
(2)使用ROW POLICY查询:
当用户test_user执行查询语句的时,Doris进行SQL改写,将ROW POLICY注入到SQL中。
select * from (select * from table1 where tenantid = 'a' )
Doris行权限实战
- 创建用户并授权
CREATE USER 'test'@'%' IDENTIFIED BY 'test';
GRANT SELECT_PRIV,LOAD_PRIV,ALTER_PRIV,CREATE_PRIV,DROP_PRIV on testdb.* TO 'test'@'%';
- 使用root用户登录,查询表原始数据,一共有4行
mysql -h127.0.0.1 -uroot -P9030
mysql> select * from testdb.user limit 10;
+------+----------+-------+------+-------+
| code | name | age | edu | email |
+------+----------+-------+------+-------+
| 1020 | 234 | 32411 | 34 | 34 |
| 1020 | ??111122 | 32411 | 34 | 34 |
| 1020 | 324133 | 32411 | 34 | 34 |
| 1020 | 324 | 324 | 34 | 34 |
+------+----------+-------+------+-------+
4 rows in set (0.26 sec)
mysql>
- 创建age = '324’的行权限,并赋予test用户
CREATE ROW POLICY test_row_policy_1 ON testdb.user
AS RESTRICTIVE TO test USING (age = '324');
- 使用test用户登录和查询数据,发现只能查询出1条数据,行权限生效
mysql -h127.0.0.1 -utest -P9030 -ptest