Postgresql 简单行级安全性 (RLS)
Postgresql simple Row-Level Security (RLS)
我正在努力解决一个基本的行级安全问题。
我首先尝试创建一个“租户”table,在对引用租户主键的其他 table 应用类似规则之前,每一行只能由租户自己看到.
我在我的策略中使用会话变量,我还想从客户端强制执行租户 UUID(不是由服务器本身生成)。
所以一开始我创建 table:
CREATE TABLE tenants (
tenant_id UUID,
name text UNIQUE,
PRIMARY KEY("tenant_id")
)
然后我启用 RLS 和强制使用给定会话变量的策略:
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenants_isolation_policy ON tenants
USING (tenant_id = current_setting('my.tenant')::UUID)
WITH CHECK (tenant_id = current_setting('my.tenant')::UUID)
然后我在 tenants
table 中插入 3 个条目:
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('9c8e4f83-c036-4fcc-a775-228887d20851', 'Tenant 1');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('1953be83-683e-4960-a689-db8d53ba8cd2', 'Tenant 2');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('064767f7-9541-4492-9a7d-0466ac94e2ec', 'Tenant 3')
然后我冒充租户1:
SET my.tenant = '9c8e4f83-c036-4fcc-a775-228887d20851'
现在我希望如果我 select 所有租户,结果我应该只有一排。
然而事实并非如此:
SELECT * FROM tenants
我得到:
tenant_id
name
9c8e4f83-c036-4fcc-a775-228887d20851
Tenant 1
1953be83-683e-4960-a689-db8d53ba8cd2
Tenant 2
064767f7-9541-4492-9a7d-0466ac94e2ec
Tenant 3
我在这里错过了什么? policy怎么可能没有被调用?
实际上,我什至不明白在我还没有设置任何会话变量的情况下,我在租户中的插入工作。感觉就是没有考虑到RLS政策。
行级安全有几个例外:
默认情况下,table所有者除外
任何超级用户除外
任何 BYPASSRLS
的用户除外
如果参数row_security
关闭,行级安全性被禁用
从你的例子来看,你似乎属于第一类。要为 table 所有者也启用行级安全性,运行
ALTER TABLE tenants FORCE ROW LEVEL SECURITY;
我正在努力解决一个基本的行级安全问题。
我首先尝试创建一个“租户”table,在对引用租户主键的其他 table 应用类似规则之前,每一行只能由租户自己看到.
我在我的策略中使用会话变量,我还想从客户端强制执行租户 UUID(不是由服务器本身生成)。
所以一开始我创建 table:
CREATE TABLE tenants (
tenant_id UUID,
name text UNIQUE,
PRIMARY KEY("tenant_id")
)
然后我启用 RLS 和强制使用给定会话变量的策略:
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenants_isolation_policy ON tenants
USING (tenant_id = current_setting('my.tenant')::UUID)
WITH CHECK (tenant_id = current_setting('my.tenant')::UUID)
然后我在 tenants
table 中插入 3 个条目:
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('9c8e4f83-c036-4fcc-a775-228887d20851', 'Tenant 1');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('1953be83-683e-4960-a689-db8d53ba8cd2', 'Tenant 2');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('064767f7-9541-4492-9a7d-0466ac94e2ec', 'Tenant 3')
然后我冒充租户1:
SET my.tenant = '9c8e4f83-c036-4fcc-a775-228887d20851'
现在我希望如果我 select 所有租户,结果我应该只有一排。
然而事实并非如此:
SELECT * FROM tenants
我得到:
tenant_id | name |
---|---|
9c8e4f83-c036-4fcc-a775-228887d20851 | Tenant 1 |
1953be83-683e-4960-a689-db8d53ba8cd2 | Tenant 2 |
064767f7-9541-4492-9a7d-0466ac94e2ec | Tenant 3 |
我在这里错过了什么? policy怎么可能没有被调用?
实际上,我什至不明白在我还没有设置任何会话变量的情况下,我在租户中的插入工作。感觉就是没有考虑到RLS政策。
行级安全有几个例外:
默认情况下,table所有者除外
任何超级用户除外
任何
BYPASSRLS
的用户除外如果参数
row_security
关闭,行级安全性被禁用
从你的例子来看,你似乎属于第一类。要为 table 所有者也启用行级安全性,运行
ALTER TABLE tenants FORCE ROW LEVEL SECURITY;