暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB行级访问控制

wanglei 2023-04-18
81

行级访问控制

更新时间:2023-02-20 GMT+08:00

行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。

用户可以在数据表创建行访问控制(Row Level Security)策略,该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户对数据表访问时,若SQL满足数据表特定的Row Level Security策略,在查询优化阶段将满足条件的表达式,按照属性(PERMISSIVE | RESTRICTIVE)类型,通过AND或OR方式拼接,应用到执行计划上。

行级访问控制的目的是控制表中行级数据可见性,通过在数据表上预定义Filter,在查询优化阶段将满足条件的表达式应用到执行计划上,影响最终的执行结果。当前受影响的SQL语句包括SELECT,UPDATE,DELETE。

场景一:某表中汇总了不同用户的数据,但是不同用户只能查看自身相关的数据信息,不能查看其他用户的数据信息。

 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
--创建用户alice, bob, peterpostgres=# CREATE USER alice PASSWORD 'xxxxxxxxx';postgres=# CREATE USER bob PASSWORD 'xxxxxxxxx';postgres=# CREATE USER peter PASSWORD 'xxxxxxxxx';--创建表all_data,包含不同用户数据信息postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100));--向数据表插入数据postgres=# INSERT INTO all_data VALUES(1, 'alice', 'alice data');postgres=# INSERT INTO all_data VALUES(2, 'bob', 'bob data');postgres=# INSERT INTO all_data VALUES(3, 'peter', 'peter data');--将表all_data的读取权限赋予alice,bob和peter用户postgres=# GRANT SELECT ON all_data TO alice, bob, peter;--打开行访问控制策略开关postgres=# ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;--创建行访问控制策略,当前用户只能查看用户自身的数据postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER);--查看表详细信息postgres=# \d+ all_data                               Table "public.all_data" Column |          Type          | Modifiers | Storage  | Stats target | Description--------+------------------------+-----------+----------+--------------+------------- id     | integer                |           | plain    |              | role   | character varying(100) |           | extended |              | data   | character varying(100) |           | extended |              |Row Level Security Policies:    POLICY "all_data_rls"      USING (((role)::name = "current_user"()))Has OIDs: noDistribute By: HASH(id)Location Nodes: ALL DATANODESOptions: orientation=row, compression=no, enable_rowsecurity=true--切换至用户alice,执行SQL"SELECT * FROM public.all_data"postgres=# SELECT * FROM public.all_data; id | role  |    data----+-------+------------  1 | alice | alice data(1 row)postgres=# EXPLAIN(COSTS OFF) SELECT * FROM public.all_data;                           QUERY PLAN---------------------------------------------------------------- Streaming (type: GATHER)   Node/s: All datanodes   ->  Seq Scan on all_data         Filter: ((role)::name = 'alice'::name) Notice: This query is influenced by row level security feature(5 rows)--切换至用户peter,执行SQL"SELECT * FROM public.all_data"postgres=# SELECT * FROM public.all_data; id | role  |    data----+-------+------------  3 | peter | peter data(1 row)postgres=#  EXPLAIN(COSTS OFF) SELECT * FROM public.all_data;                           QUERY PLAN---------------------------------------------------------------- Streaming (type: GATHER)   Node/s: All datanodes   ->  Seq Scan on all_data         Filter: ((role)::name = 'peter'::name) Notice: This query is influenced by row level security feature(5 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论