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

如何为多对多关系正确实现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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:20:04