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

Supabase行级安全策略无数据返回问题求助

问题分析与解决方案

你的行级安全策略逻辑存在两个核心错误,导致无法返回预期数据:

错误点解析

  1. 子查询未关联当前登录用户
    你写的exists和in子查询只是在users表内做无意义的自关联(判断当前行的organisation_id是否存在于表中),完全没有关联到当前登录用户的组织ID,等于没做任何权限校验。

  2. 用户类型判断逻辑搞反
    策略里的type='admin'是判断被查询行的用户是否为admin,而不是当前登录用户是否为admin。这完全违背了你“管理员可以查看同组织用户”的需求。

正确的行级安全策略

以下是修正后的策略,严格匹配你的需求:

ALTER TABLE users ENABLE ROW LEVEL SECURITY;

CREATE POLICY "用户可查看自己的记录" ON users
FOR SELECT USING (auth.uid() = id);

CREATE POLICY "管理员可查看同组织的其他用户" ON users
FOR SELECT USING (
  EXISTS (
    SELECT 1 FROM users u_current
    WHERE u_current.id = auth.uid()
    AND u_current.type = 'admin'
    AND u_current.organisation_id = users.organisation_id
  )
);

或者合并成一个策略:

CREATE POLICY "用户可查看自身或同组织管理员可查看同组织用户" ON users
FOR SELECT USING (
  auth.uid() = id
  OR
  EXISTS (
    SELECT 1 FROM users u_current
    WHERE u_current.id = auth.uid()
    AND u_current.type = 'admin'
    AND u_current.organisation_id = users.organisation_id
  )
);

额外注意事项

  • 确保users表的id字段存储的是用户的认证UID(即与auth.uid()返回值一致),如果你的users表用了自增ID,需要替换成存储认证UID的字段(比如auth_id)。
  • 确认已经执行ALTER TABLE users ENABLE ROW LEVEL SECURITY;启用行级安全。

内容的提问来源于stack exchange,提问作者Haydn Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:48:27