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