PostgreSQL 行级安全性策略应用

1. 概述

    行级安全性策略是PG9.5新加的一个功能,它是一种粒度更细的,针对行级所做的权限控制。

    它可以对每一个用户限制哪些行可以进行查询操作或增删改的操作。

 

2. 特性介绍

    默认情况下,表是没有行级安全性的,要想使表有行级安全性,需要使用命令:

    ALTER TABLE .... ENABLE ROW LEVEL SECURITY;

    是表有行级安全性检查。所有对该表的操作(表的属主除外),都要经过行级安全性策略的允许。 

    但是表级的操作,如truncate不服从行级安全性策略。

 

    下面介绍下怎么创建行级安全性策略。

    语法为:    

CREATE POLICY name ON table_name
[ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
[ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
[ USING ( using_expression ) ]
[ WITH CHECK ( check_expression ) ]

    //name -- 策略名称
    //table_name -- 适用于该策略的表
    //FOR -- 该策略适用的DML命令,ALL表示所有
    //TO -- 该策略适用的角色
    //USING -- 应用在表上的CHECK表达式,返回true的行可见,false不可见
    //WITH CHECK -- 应用在该表的INSERT或UPDATE的SQL表达式,true的可以操作,false操作失败

 

    针对行级安全策略,有两个系统表记录信息。

    pg_policy  系统表

polname策略名称
polrelid策略适用的表
polcmd策略命令类型:r-select,a-insert,w-update,d-delete,*-所有类型
polroles策略适用角色
polqual策略限制的查询条件
polwithcheck被作为WITH CHECK 条件增加到尝试向表增加行的查询的表达式树

    

    pg_policies系统表

schemaname策略所在表的模式名
tablename策略所在的表名
policyname策略名
roles策略所适用的角色
cmd策略所适用的命令类型
qual策略限制的查询条件
with_check被作为WITH CHECK 条件增加到尝试向表增加行的查询的表达式树

 

3. 示例

    a ) 建表

postgres=# create table test_policy(id int, usr name,  tm timestamp default clock_timestamp());
CREATE TABLE
postgres=# insert into test_policy(id, usr) values(1, 'user1');
INSERT 0 1
postgres=# insert into test_policy(id, usr) values(2, 'user2');
INSERT 0 1
postgres=# insert into test_policy(id, usr) values(3, 'user2'); 
INSERT 0 1
postgres=# insert into test_policy(id, usr) values(4, 'user2');
INSERT 0 1
postgres=# insert into test_policy(id, usr) values(5, 'user1');
INSERT 0 1
postgres=# insert into test_policy(id, usr) values(5, 'user3');
INSERT 0 1

    b) 设置行级安全检查

postgres=# ALTER TABLE test_policy ENABLE ROW LEVEL SECURITY;
ALTER TABLE

    c) 创建测试角色

postgres=# create role user1 with login;
CREATE ROLE
postgres=# create role user2 with login;
CREATE ROLE
postgres=# create role user3 with login;
CREATE ROLE
postgres=# grant select on test_policy to user1,user2,user3;
GRANT

    d) 创建策略

postgres=# CREATE POLICY pol1 ON test_policy
postgres-# FOR SELECT TO PUBLIC
postgres-# USING (usr = current_user);
CREATE POLICY

    e) 以user1登录数据库,测试

postgres=# \c postgres user1
You are now connected to database "postgres" as user "user1".
postgres=> select * from test_policy ;
 id |  usr  |             tm             
----+-------+----------------------------
  1 | user1 | 2017-10-20 14:37:38.065646
  5 | user1 | 2017-10-20 14:37:38.0983
(2 rows)

    可以看出以只有usr字段值为user1才对用户user1可见。

    f) 多个策略共同作用一张表时

postgres=# CREATE POLICY pol2 ON test_policy
postgres-# FOR SELECT TO PUBLIC
postgres-# USING (id = 5);
CREATE POLICY

    再创建一个策略作用同一张表,设置其他的限制查询条件。

    再以user1登录,执行查询,

postgres=# \c postgres user1
You are now connected to database "postgres" as user "user1".
postgres=> select * from test_policy ;
 id |  usr  |             tm             
----+-------+----------------------------
  1 | user1 | 2017-10-20 14:37:38.065646
  5 | user1 | 2017-10-20 14:37:38.0983
  5 | user3 | 2017-10-20 14:37:38.645789
(3 rows)

可以看出其查询结果是pol1和pol2两个策略进行OR的结果。

目前9.6之前的版本还不支持多个策略AND的结果,据说PG10已经新增了该功能。

转载于:https://my.oschina.net/tianbing/blog/1553892

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值