pgsql的行级权限设置

pgsql中行级权限的应用

简介

行级安全性(RLS)是一个特性,允许您根据执行查询的用户来限制查询返回的行。

RLS 允许您,根据当前用户和由策略定义的特定条件,来控制对表中各个行的访问。

此外要注意的是,此表设置完行级权限后,对应角色才会进入设置的规则,没设置过的角色没有权限访问,可以设置一个默认database_admin角色,每次给上true的条件,表管理者没影响

语句创建

使用ALTER TABLE语句,在表上启用行级安全性:

ALTER TABLE table_name

ENABLE ROW LEVEL SECURITY;

创建安全策略

CREATE POLICY name ON table_name

USING (condition);

此外,表所有者也会绕过行级安全性。要对表所有者应用行级安全性,可以使用FORCE ROW LEVEL SECURITY选项修改表:

ALTER TABLE table_name

FORCE ROW LEVEL SECURITY;

示例

--切换角色

set role postgres;

-- 创建角色 注意此时创建的角色,同时设置为了用户

CREATE ROLE def LOGIN PASSWORD 'qweasd123';

--切换角色

set role def;

--select 权限不够

select * from user_custom;

-- 创建角色用户 测试

CREATE ROLE def1 LOGIN PASSWORD 'qweasd123';

-- 创建角色用户 测试

CREATE ROLE demo1 LOGIN PASSWORD 'qweasd123';

--给予所有权限

set role postgres;

GRANT ALL ON ALL TABLES IN SCHEMA public TO def;

--开启表结构行级权限

ALTER TABLE user_custom ENABLE ROW LEVEL SECURITY;

-- 可不开启 管理员用于强制表的所有用户遵循行级安全性策略

ALTER TABLE user_custom FORCE ROW LEVEL SECURITY;

--创建行级权限

CREATE POLICY def1 ON user_custom FOR SELECT TO def1 USING(age >= 2);

--切换角色

set role def1;

--select

select * from user_custom;

--age>2的数据

--切换角色

set role def;

--select

select * from user_custom;

--无数据

--切换角色

set role demo1;

--select

select * from user_custom;

--无权限

--额外查询sql

--删除权限

REVOKE ALL ON ALL TABLES IN SCHEMA public FROM def1;

--查询行级权限

SELECT * FROM pg_policies

WHERE tablename = 'xxpta_mstr';

SELECT * FROM pg_policies

WHERE policyname like 'def1%'

-- 删除

DROP POLICY IF EXISTS def1 ON user_custom;

--查询

SELECT * FROM pg_policies

WHERE tablename = 'user_custom'

AND policyname = 'view_all_policy' ;

--SELECT TABLE 行级权限

SELECT

relname AS TableName,

relrowsecurity AS IsRowLevelSecurityEnabled,

relforcerowsecurity AS ForceRowLevelSecurity

FROM

pg_class

WHERE

relname = 'user_custom';

-- relname:表名。

-- relrowsecurity:若值为 true,则表示行级安全性已启用。

-- relforcerowsecurity:若值为 true,则强制所有用户遵循行级安全性策略(即使拥有 BYPASSRLS 权限也无法绕过)

相关推荐
小龙报11 分钟前
【数据结构与算法】栈和队列的综合应用:1.用栈实现队列 2.用队列实现栈 3.设计循环队列
c语言·数据结构·数据库·c++·redis·算法·缓存
dapeng287015 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
sxhcwgcy22 分钟前
Spring.factories
java·数据库·spring
Mike117.28 分钟前
GBase 8a 数据同步实践:从 T+1 同步、实时镜像到一写多读的落地思路
java·服务器·数据库
eggwyw29 分钟前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
油丶酸萝卜别吃30 分钟前
Redis 通常应用于哪些场景?
数据库·redis·缓存
zhoupenghui16837 分钟前
redis 快速链表 详解
数据库·redis·链表·quicklist·快速链表
AlunYegeer37 分钟前
论mysql的redo_log和bin_log,redis的RDB和AOF的类似记忆
数据库·redis·mysql
2401_874732531 小时前
构建一个桌面版的天气预报应用
jvm·数据库·python
码云数智-园园1 小时前
坚如磐石:数据库事务ACID特性的实现奥秘
数据库·oracle