PG行级安全策略实现
学习使用行级安全(RLS)控制用户对表中特定行的访问 · 难度:入门 · +15XP
行级安全概念
行级安全(Row-Level Security, RLS)允许基于用户角色定义策略,控制哪些行可以被查询、插入、更新或删除。
启用行级安全
-- 创建测试表
CREATE TABLE employee_data (
id SERIAL PRIMARY KEY,
name TEXT,
department TEXT,
salary NUMERIC
);
-- 启用RLS
ALTER TABLE employee_data ENABLE ROW LEVEL SECURITY;
创建策略
-- 允许员工查看自己部门的记录
CREATE POLICY dept_policy ON employee_data
FOR SELECT
USING (department = current_setting('my.dept'));
-- 创建不同角色
CREATE ROLE hr_worker;
CREATE ROLE finance_worker;
-- 授予权限
GRANT SELECT ON employee_data TO hr_worker, finance_worker;
测试策略
-- 设置会话参数模拟部门
SET my.dept = 'HR';
SELECT * FROM employee_data; -- 只看到HR部门
SET my.dept = 'Finance';
SELECT * FROM employee_data; -- 只看到Finance部门
策略类型
| 命令 | 策略类型 |
|---|---|
| SELECT | FOR SELECT |
| INSERT | FOR INSERT(WITH CHECK) |
| UPDATE | FOR UPDATE(USING + WITH CHECK) |
| DELETE | FOR DELETE(USING) |
练习提示
创建一张包含用户ID和数据的表,设置RLS策略使每个用户只能看到自己的数据。