如何为Supabase的contracts表配置关联customers表的RLS规则?
实现contracts表的RLS规则配置
前提确认
确保contracts表已通过customer_id字段与customers表建立关联(即contracts.customer_id是指向customers.customer_id的外键),如果还没建外键,先执行:
ALTER TABLE contracts ADD CONSTRAINT fk_contract_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
步骤1:启用contracts表的行级安全(RLS)
首先需要开启contracts表的RLS,执行SQL:
ALTER TABLE contracts ENABLE ROW LEVEL SECURITY;
步骤2:创建SELECT权限规则
这条规则会限制用户仅能查看属于自己客户的合同,核心是通过关联customers表验证profile_id匹配:
CREATE POLICY "仅查看自己客户的合同" ON contracts FOR SELECT USING ( EXISTS ( SELECT 1 FROM customers WHERE customers.customer_id = contracts.customer_id AND customers.profile_id = auth.id() ) );
可选:添加其他操作的RLS规则
如果需要限制用户只能对自己客户的合同进行插入、更新或删除操作,可以添加以下规则:
插入规则(确保插入的合同属于自己的客户)
CREATE POLICY "仅为自己的客户插入合同" ON contracts FOR INSERT WITH CHECK ( EXISTS ( SELECT 1 FROM customers WHERE customers.customer_id = contracts.customer_id AND customers.profile_id = auth.id() ) );
更新规则
CREATE POLICY "仅更新自己客户的合同" ON contracts FOR UPDATE USING ( EXISTS ( SELECT 1 FROM customers WHERE customers.customer_id = contracts.customer_id AND customers.profile_id = auth.id() ) );
删除规则
CREATE POLICY "仅删除自己客户的合同" ON contracts FOR DELETE USING ( EXISTS ( SELECT 1 FROM customers WHERE customers.customer_id = contracts.customer_id AND customers.profile_id = auth.id() ) );
通过Supabase控制台操作(适合新手)
如果不习惯写SQL,可以通过GUI配置:
- 登录Supabase控制台,进入目标项目
- 导航至
Database→Tables,找到contracts表 - 切换到
RLS标签,先点击"Enable RLS"开启行级安全 - 点击"New Policy",选择"Custom policy"
- 填写规则名称(如"查看自己客户的合同"),选择对应的操作(如SELECT)
- 在"USING expression"输入框中填入:
EXISTS (SELECT 1 FROM customers WHERE customers.customer_id = contracts.customer_id AND customers.profile_id = auth.id()) - 保存规则即可
原理说明
通过EXISTS子查询关联customers表,利用已有的profile_id与用户auth.id()的匹配逻辑,无需在contracts表中重复存储profile_id字段,既避免了数据冗余,又继承了customers表的权限控制逻辑。
内容的提问来源于stack exchange,提问作者J0mk
相关产品推荐
相关产品推荐

