Postgres是否支持用户/角色自定义属性?v14中可在RLS策略引用吗?
PostgreSQL 用户/角色自定义属性与RLS策略引用方案
PostgreSQL 本身没有原生支持为用户/角色添加自定义属性的功能,但可以通过两种可靠方式实现你要的租户隔离需求,完全兼容 v14 版本:
推荐方案:自定义属性表+RLS关联
这是最安全、易维护的方式,步骤清晰:
1. 创建存储用户属性的表
CREATE TABLE user_attributes ( username TEXT PRIMARY KEY REFERENCES pg_roles(rolname), tenant_id INT NOT NULL );
这个表和系统角色表做关联,避免出现无效用户的属性数据。
2. 给用户添加租户属性
INSERT INTO user_attributes (username, tenant_id) VALUES ('fred', 123), ('bob', 987);
3. 在RLS策略中引用属性
先给业务表开启RLS:
ALTER TABLE your_business_table ENABLE ROW LEVEL SECURITY;
然后创建隔离策略,通过current_user获取当前登录用户的租户ID,实现数据隔离:
CREATE POLICY tenant_isolation_policy ON your_business_table FOR ALL USING ( tenant_id = (SELECT tenant_id FROM user_attributes WHERE username = current_user) );
这样用户只能访问与自己租户ID匹配的数据。
备选方案:角色继承+会话变量
如果不想用自定义表,也可以给每个租户创建专属角色(比如tenant_123),把用户fred加入该角色,然后在用户登录时设置会话变量:
SET app.tenant_id = 123;
之后RLS策略可以通过current_setting('app.tenant_id')::INT来匹配租户ID,但这种方式需要确保用户登录时自动设置变量,可靠性不如自定义表方案。
重要提醒:不要直接修改系统表
不要尝试直接修改pg_authid这类系统表来添加自定义属性,这会破坏PostgreSQL的稳定性,且数据库升级时数据极有可能丢失,绝对不推荐。
内容的提问来源于stack exchange,提问作者Peter Rilling
相关产品推荐
相关产品推荐

