You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:55:12