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

Supabase Postgres RLS条件插入权限配置问题求助

解决方案:配置RLS实现仅允许插入所属记录的关联关系

1. 正确的RLS插入策略

你之前的尝试混淆了RLS中USING和WITH CHECK的作用:USING子句用于判断用户是否具备插入权限(通常基于表中已存在的数据),而要验证待插入行的条件,必须使用WITH CHECK子句,并且通过NEW关键字访问待插入的字段值。

以下是满足需求的正确策略:

-- 确保records_users表已启用行级安全
ALTER TABLE public.records_users ENABLE ROW LEVEL SECURITY;

-- 创建插入策略
CREATE POLICY "仅允许插入自己创建的记录的关联关系"
ON public.records_users
FOR INSERT
WITH CHECK (
  EXISTS (
    SELECT 1 FROM public.records
    WHERE records.record_id = NEW.record_id
      AND records.created_by = auth.uid()
  )
);

这个策略会验证:待插入的record_id对应的records表记录,其created_by字段必须等于当前认证用户的ID(auth.uid()),只有满足条件的插入操作才会被允许。

2. RPC函数的补充方案(若需保留函数实现)

如果坚持用RPC函数完成插入,可在函数内自行实现权限校验,同时通过SECURITY DEFINER绕过RLS限制(需注意安全控制):

CREATE OR REPLACE FUNCTION public.insert_records_users(p_record_id INT, p_user_id INT)
RETURNS void AS $$
BEGIN
  -- 先验证当前用户是否有权限操作该record
  IF NOT EXISTS (
    SELECT 1 FROM public.records
    WHERE record_id = p_record_id
      AND created_by = auth.uid()
  ) THEN
    RAISE EXCEPTION '无权限插入该记录的关联关系';
  END IF;

  -- 执行插入操作
  INSERT INTO public.records_users(record_id, user_id)
  VALUES(p_record_id, p_user_id);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path = public;

-- 授权普通认证用户调用该函数
GRANT EXECUTE ON FUNCTION public.insert_records_users(INT, INT) TO authenticated;

该函数会先自行校验权限,再执行插入,既避免了无限制开放records_users的插入权限,也能通过RPC完成业务操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:13:19