什么是行级权限?
基于行的安全策略,限制数据库用户的查看表数据权限。
采用RLS后,不同的用户访问一个表可以看到不同的数据。
属于权限中的粗粒度权限
松鼠举个栗子
创建测试用户
est=# create user u1 password '123';CREATE ROLEtest=#
创建测试表,插入数据
test=# create table t1(id int);CREATE TABLEtest=#test=# insert into t1 values (10),(11),(12),(13),(14);INSERT 0 5
为用户增加权限
test=# grant all ON tt1 TABLE TABLESPACE TYPEtest=# grant all ON TABLE t1 TO u1;GRANT
启用行级权限
test=# alter table t1 enableALWAYS NOVALIDATE REPLICA RULE UNIQUE (CONSTRAINT PRIMARY KEY ROW LEVEL SECURITY TRIGGER VALIDATEtest=# alter table t1 enable ROW LEVEL SECURITY ;ALTER TABLEtest=#test=# create policy p1 ON t1 using ( id != 10 and id != 13 ) to u1;错误: 语法错误 在 "to" 或附近的第1行...reate policy p1 ON t1 using ( id != 10 and id != 13 ) to u1;^test=# create policy p1 ON t1 using ( id != 10 and id != 13 ) ;CREATE POLICYtest=#test=# alter policy p1 totest=# alter policy p1 ON t1RENAME TO TO USING ( WITH CHECK (test=# alter policy p1 ON t1 TO u1 ;ALTER POLICYtest=#
测试1
test=# \c - u1;您现在已经连接到数据库 "test",用户 "u1".test=>test=>test=> select * from t1;id----111214(3 行记录)
测试2
test=> \c - system您现在已经连接到数据库 "test",用户 "system".test=#test=# alter policy p1 ON t1 USING ( id = 10 or id = 13);ALTER POLICYtest=#test=# \c - u1您现在已经连接到数据库 "test",用户 "u1".test=>test=> select * from t1;id----1013(2 行记录)
测试3
test=> \c - system您现在已经连接到数据库 "test",用户 "system".test=#test=# alter policy p1 ON t1 USING ( id = 10 and id = 13);ALTER POLICYtest=#test=# \c - u1;您现在已经连接到数据库 "test",用户 "u1".test=>test=> select * from t1;id----(0 行记录)
测试4
test=> \c - system您现在已经连接到数据库 "test",用户 "system".test=#test=# alter policy p1 ON t1 USING ( id = 10 and id != 13);ALTER POLICYtest=#test=# \c - u1;您现在已经连接到数据库 "test",用户 "u1".test=>test=> select * from t1;id----10(1 行记录)test=> select * from t1 where id = 10 and id != 13;id----10(1 行记录)test=> select * from t1 where id = 10 and id = 13;id----(0 行记录)test=>test=> select * from t1 where id != 10 and id !=13;id----(0 行记录)test=>test=> select * from t1 where id != 10 and id != 13;id----(0 行记录)test=> select * from t1 where id != 10 or id != 13;id----10(1 行记录)test=> select * from t1;id----10(1 行记录)
思考
行级权限与”where”
扩展:列级权限
细粒度权限
形式一:列级细粒度权限
比如,授权user1只能看到t1表的name列的数据。
形式二:行级细粒度权限
比如,授权user1能看到t1表的所有列,但只能看到符合条件的少量数据行。
以列级安全控制为例,演示KES的列级细粒度权限
实验:让某用户只能看到表的部分字段
创建新的测试数据
test=# create table t1(ename name,sal int,comm text);CREATE TABLEtest=#test=# insert into t1 values ('king',10000,'abc');INSERT 0 1test=# insert into t1 values ('base',20000,'def');INSERT 0 1test=#
创建测试用户
test=#test=# create user user1 password '123';CREATE ROLEtest=#
执行细粒度授权
test=# grant select (ename,sal) on t1 to user1 ;GRANTtest=#test=# \dp+ t1;存取权限架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略----------+------+--------+----------+------------------+------public | t1 | 数据表 | | ename: +|| | | | user1=r/system+|| | | | sal: +|| | | | user1=r/system |(1 行记录)test=#test=# select * from t1;ename | sal | comm-------+-------+------king | 10000 | abcbase | 20000 | def(2 行记录)
结果
test=> select * from t1;错误: 对表 t1 权限不够test=>test=>test=> select ename,sal from t1;ename | sal-------+-------king | 10000base | 20000(2 行记录)test=>
实验:让某用户能查询所有字段,但只能修改部分字段
创建新的测试用户并授权
test=# create user admin password 'kingbase';CREATE ROLEtest=#test=# grant select,update(sal) on ttest=# grant select,update(sal) on t1 to admin;GRANTtest=#
打印表上的权限清单
test=# \dp t1;存取权限架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略----------+------+--------+-----------------------+------------------+------public | t1 | 数据表 | system=arwdDxt/system+| sal: +|| | | admin=r/system | admin=w/system |(1 行记录)
实验结果
test=# \c - admin您现在已经连接到数据库 "test",用户 "admin".test=>test=> select * from t1;ename | sal | comm-------+-------+------king | 10000 | abcbase | 20000 | def(2 行记录)test=>test=> update t1 set sal=sal*1.1;UPDATE 2test=>test=> select * from t1;ename | sal | comm-------+-------+------king | 11000 | abcbase | 22000 | def(2 行记录)test=> update t1 set comm = 'c' where comm = 'b';错误: 对表 t1 权限不够test=>
参考学习
https://cdn.modb.pro/db/105031
https://mp.weixin.qq.com/s/iXMT67y7C1a34tcZfET6jA
