我们在一般的数据库中可能对用户的查询权限只能到表级别,例如限制某个用户只能查询哪些表。PostgreSQL从9.5版本开始支持行级别的权限管控,允许不同的用户在表上查询到不同的数据。

通过在表和角色上创建不同的策略来限制不同用户对于表的权限:

Command:     CREATE POLICY
Description: define a new row-level security policy for a table
Syntax:
CREATE POLICY name ON table_name[ AS { PERMISSIVE | RESTRICTIVE } ][ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ][ TO { role_name | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ][ USING ( using_expression ) ][ WITH CHECK ( check_expression ) ]URL: https://www.postgresql.org/docs/14/sql-createpolicy.html

需要注意的是,要做到行级安全性的管控,需要在表上开启行级安全性。

ALTER TABLE ... ENABLE ROW LEVEL SECURITY

对于create policy中,需要注意:

  • using 针对已经存在的记录的校验. 可实施在select, update, delete, ALL上
  • whth check 针对将要新增的记录的校验, 可实施在insert, update, ALL上

针对不同的命令类型使用的策略类型如下:

下面我们通过例子来看看如何使用:
首先创建测试表:

bill@bill=>create table t1 (id int,name text);
CREATE TABLE
bill@bill=>insert into t1 values(1,'user01');
INSERT 0 1
bill@bill=>insert into t1 values(2,'user02');
INSERT 0 1
bill@bill=>select * from t1;id |  name
----+--------1 | user012 | user02
(2 rows)

新建一个用户:

bill@bill=>create user user01 ;
CREATE ROLE
bill@bill=>grant select ON public.t1 to user01;
GRANT

例1:限制user01只能查询t1表中name='user01’的数据
创建策略:

bill@bill=>create policy user01_select_t1 ON t1 for select to user01 using(current_user=name);
CREATE POLICY

我们需要在表上开启行级安全性,否则该策略默认是disabled

bill@bill=>\d t1Table "public.t1"Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------id     | integer |           |          |name   | text    |           |          |
Policies (row security disabled):POLICY "user01_select_t1" FOR SELECTTO user01USING ((CURRENT_USER = name))

开启行级安全性:

bill@bill=>alter table t1 enable row level security ;
ALTER TABLE

使用user01查看:

bill@bill=>\c - user01
You are now connected to database "bill" as user "user01".
user01@bill=>select * from t1;id |  name
----+--------1 | user01
(1 row)

例2:创建新增数据的策略

bill@bill=> create policy user01_insert_t1 on t2 for insert to user01 with check( name = current_user);
CREATE POLICY
bill@bill=>alter table t2 enable row level security ;
ALTER TABLE

我们创建了该策略,然后使用user01插入试试:

user01@bill=>insert into t2 values(3,'user01');
ERROR:  permission denied for table t2

没有权限,这是怎么回事?我们前面说了,对于insert需要使用with check进行限制。

重建策略:

bill@bill=>drop policy user01_insert_t1 ON t2;
DROP POLICY
bill@bill=>create policy user01_insert_t1 on t2 for insert to user01 with check(true);
CREATE POLICY

再次切换user01用户插入:

user01@bill=>insert into t2 values(3,'user03');
INSERT 0 1

我们再试试其它用户可不可以插入:

user01@bill=>\c - user02
You are now connected to database "bill" as user "user02".
user02@bill=>insert into t2 values(3,'user03');
ERROR:  permission denied for table t2

可以看到user02没法插入数据了,说明我们的策略生效了。

除了RLS来限制用户访问数据的安全策略外,pg中还允许对行数据进行加密,这样对于用户来说某些关键的数据也是起到了限制访问的作用。

数据加密首先需要安装pgcrypto扩展:

bill@bill=>create extension pgcrypto ;
CREATE EXTENSION

这里简单演示下如何进行加密。

新建表:

bill@bill=>create table t1(id int,name text,password text);
CREATE TABLE

我们使用pgcrypto来对该表的password列进行加密,这里使用md5进行加密:

bill@bill=>insert into t1 values(1,'bill',crypt('123456',gen_salt('md5')));
INSERT 0 1
bill@bill=>select * from t1;id | name |              password
----+------+------------------------------------1 | bill | $1$4wUg1TlS$Fy7zodd7dRURSuI88GHx00
(1 row)

验证:返回t说明输入的密码正确。

bill@bill=>SELECT (password  = crypt('123456',password)) AS pwmd5 FROM t1 ;pwmd5
-------t
(1 row)

参考链接:
http://www.postgres.cn/docs/12/sql-createpolicy.html
http://www.postgres.cn/docs/12/pgcrypto.html

PostgreSQL行级安全策略RLS和数据加密相关推荐

  1. rls数据预测_SQL Server数据安全功能RLS(行级安全性)和GDPR

    rls数据预测 Of late, there's been a lot of noise around the term, GDPR. Chances are, some of us even had ...

  2. PowerBI开发 第十八篇:行级安全(RLS)

    PowerBI可以通过RLS(Row-level security)限制用户对数据的访问,过滤器在行级别限制数据的访问,用户可以在角色中定义过滤器,通过角色来限制数据的访问.在PowerBI Serv ...

  3. sql 如何设置行级锁_SQL Server 2016中的行级安全性

    sql 如何设置行级锁 With the release of SQL Server 2016 comes many great new features. One of these is the i ...

  4. sql 如何设置行级锁_SQL Server中的行级安全性简介

    sql 如何设置行级锁 In this article, I'm going to discuss Row-Level Security in SQL Server. RLS or Row-Level ...

  5. sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问

    sql 如何设置行级锁 SQL Server 2016 came with many new features and enhancements for existing ones, that con ...

  6. 解决数据分权访问----SQL2016 行级安全解决方案

    这个数据爆炸的年代,数据安全性不可忽视,很多客户都曾经无数次的问到这个问题如何解决数据读取时候的安全性,如何实现用户分角色.分职位.分group来区分数据.简单来讲不同用户在读取数据时候,得到的数据不 ...

  7. 行级共享锁和行级排他锁_Power BI中的行级安全性简介

    行级共享锁和行级排他锁 Analyzing data with Power BI has always been fascinating to me. With ever-growing data c ...

  8. mysql数据库的行级锁有几种_数据库行级锁和表锁区别

    MyISAM和InnoDB MyISAM MyISAM使用B+tree作为索引结构,叶节点存放的是数据地址. MyISAM不支持事务和外键. MyISAM是表锁,对数据库写操作时会锁住整个表,效率低. ...

  9. 使用SQL Server行级安全性的分片多租户数据库

    目录 介绍 背景 创建Catalog 数据库 关于分片方法的简要介绍 创建共享多租户数据库 关于聚集索引的简短说明 创建安全谓词函数 创建DDL触发器以强制执行安全谓词 创建租户 最终测试 附录 1 ...

最新文章

  1. Flutter 构建完整应用手册-动画
  2. Redis NoSQL
  3. Python开发【Part 4】:数据类型操作
  4. CVPR 2020 运行12-in-1遇到的问题及解决办法(持续更新中)
  5. LiveVideoStack线上分享第四季(十二):实时音视频抗丢包的实践
  6. 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
  7. 公有云退款流程及政策--退款规则及退款流程(阿里云 华为云) --2020-09-03
  8. gulpsass安装配置
  9. =、:=、?=、+=
  10. 国庆记事之一:小白结婚及我跟女朋友吵架
  11. C语言小案例_OA大典故障案例摘录【第1400篇】理光2501载体初始化
  12. Conficker蠕虫作者可随时引爆“网络核武”
  13. 如何把播放器转换成HTML5,Chrome把普通flash播放器转变成HTML5播放器插件:HTML5ify...
  14. linux软件安装文档总结
  15. C++基础知识(7)
  16. 【论文阅读】Pothole Detection Based on Disparity Transformation and Road Surface Modeling
  17. 大卫 异星觉醒 机器人_异星觉醒结局翻转恶心到观众?隐藏剧情暗含深意
  18. gif透明背景动画_BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点
  19. 再见,世界首富!再见,马云!
  20. python读取.csv 大文件的解决办法(iterator=true)

热门文章

  1. 开发者大会优先谈云,对于微软Win10还重要吗
  2. Python Network(一)基础入门(节点和边基本概念,网络统计量)
  3. 基于JAVA的企业部门报销管理信息系统的设计与实现
  4. 【期末复习】计算机组成原理 袁春风
  5. python十六进制转换成二进制_python - 将十六进制转换为二进制
  6. LGWR waits for event ‘DLM cross inst call completion’ 故障排除
  7. java生成 *.crt和*.key文件与*.keystore *.jks文件的转换
  8. r55600h和i511320h哪个好
  9. 通过Java批量导出带有图片的Excel文件数据
  10. 浅析-微服务3搭建框架