如何为多对多关系正确实现RLS策略?解决Supabase递归报错
解决RLS无限递归错误&实现同行程用户访问限制
你遇到的无限递归错误,核心问题是现有策略逻辑混乱,且和trip_user表的RLS规则形成了循环依赖。另外你贴的第二个策略完全写错了作用表——明明要限制users表的访问,结果配置在了trips表上,子查询逻辑也完全不成立。
下面是正确的分步配置方案:
1. 先配置trip_user关联表的RLS策略
这个表是多对多关系的核心,先确保用户只能看到自己的行程关联记录:
ALTER POLICY "用户仅能查看自身的行程关联数据" ON public.trip_user TO authenticated USING (user_id = auth.uid());
auth.uid()会获取当前认证用户的ID,这条规则确保用户只能访问自己和行程的关联条目,避免后续循环查询。
2. 配置trips表的RLS策略
让用户只能查看自己参与的行程:
ALTER POLICY "用户仅能查看自己参与的行程" ON public.trips TO authenticated USING ( id IN ( SELECT trip_id FROM trip_user WHERE user_id = auth.uid() ) );
通过子查询从trip_user中筛选出当前用户参与的所有行程ID,确保用户只能访问自己的行程数据。
3. 配置users表的RLS策略(实现核心需求)
让用户只能查看和自己同属一个行程的其他用户:
ALTER POLICY "用户仅能查看同行程的其他用户" ON public.users TO authenticated USING ( id IN ( SELECT tu2.user_id FROM trip_user tu1 JOIN trip_user tu2 ON tu1.trip_id = tu2.trip_id WHERE tu1.user_id = auth.uid() ) );
逻辑说明:
- 通过
tu1找到当前用户参与的所有行程ID - 关联
tu2获取这些行程下的所有用户ID - 最终限制用户只能访问这些ID对应的用户数据
错误原因复盘
- 你之前的
trips表策略中,子查询直接读取整个trip_user表(没有限定当前用户),如果trip_user已开启RLS,就会触发循环检查,导致无限递归。 - 第二条策略错误地将
users的权限规则配置在了trips表上,逻辑完全不符合需求。
内容的提问来源于stack exchange,提问作者Chester T.
相关产品推荐
相关产品推荐

