Supabase行级安全策略无数据返回问题求助
问题分析与解决方案
你的行级安全策略逻辑存在两个核心错误,导致无法返回预期数据:
错误点解析
子查询未关联当前登录用户
你写的exists和in子查询只是在users表内做无意义的自关联(判断当前行的organisation_id是否存在于表中),完全没有关联到当前登录用户的组织ID,等于没做任何权限校验。用户类型判断逻辑搞反
策略里的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
相关产品推荐
相关产品推荐

