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 权限也无法绕过)

相关推荐
abc123456sdggfd3 分钟前
HTML5中Vuex持久化插件中WebStorage的底层配置
jvm·数据库·python
pele5 分钟前
Go语言如何发GET请求_Go语言HTTP GET请求教程【总结】
jvm·数据库·python
weixin_580614005 分钟前
Go 语言中 go install 命令的正确用法与常见误区详解
jvm·数据库·python
qq_654366986 分钟前
Bootstrap 5移除jQuery依赖 Bootstrap 5如何不使用jQuery
jvm·数据库·python
m0_676544388 分钟前
CSS如何实现元素悬浮在页面底部_利用fixed定位与底部间距
jvm·数据库·python
weixin_568996069 分钟前
Redis怎样监控当前发生了多少次内存驱逐
jvm·数据库·python
2301_7965885010 分钟前
CSS如何制作导航栏平滑移动_使用transition与left属性
jvm·数据库·python
2301_8038756110 分钟前
C#怎么清空Dictionary字典_C#如何管理内存集合【基础】
jvm·数据库·python
Greyson111 分钟前
CSS项目开发如何提速_应用BEM规范建立可复用的样式库.txt
jvm·数据库·python
2301_8135995513 分钟前
如何设计MongoDB的金融交易流水表_防篡改与精确金额存储Decimal128
jvm·数据库·python