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

PostgREST 插入数据时自动添加已认证用户ID的方法咨询

Supabase + PostgREST 插入数据自动填充创建者ID方案

实现步骤

1. 准备业务表字段

首先在你的业务表中预留存储创建者ID的字段,示例以业务表public.posts、存储用户ID的字段user_id为例:

-- 已有表新增字段的执行语句
ALTER TABLE public.posts 
ADD COLUMN user_id uuid REFERENCES auth.users(id) NOT NULL;

2. 回收普通用户对该字段的写入权限

从根源禁止用户自行指定/修改user_id字段的取值:

REVOKE INSERT, UPDATE OF user_id ON public.posts FROM anon, authenticated;

3. 创建自动填充触发器函数

CREATE OR REPLACE FUNCTION public.set_create_user_id()
RETURNS TRIGGER AS $$
BEGIN
  -- 插入数据时自动填充当前登录用户的ID
  NEW.user_id = auth.uid();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

-- 限制函数执行权限,避免被恶意调用
REVOKE ALL ON FUNCTION public.set_create_user_id() FROM PUBLIC;

4. 绑定触发器到业务表

CREATE TRIGGER trigger_set_posts_user_id
BEFORE INSERT ON public.posts
FOR EACH ROW EXECUTE FUNCTION public.set_create_user_id();

可选配套安全配置(推荐开启)

配合行级安全策略,限制用户仅能操作自己创建的数据:

-- 开启业务表的行级安全
ALTER TABLE public.posts ENABLE ROW LEVEL SECURITY;

-- 查看权限:仅能查看自己创建的内容
CREATE POLICY "Allow users to view own posts" ON public.posts
FOR SELECT USING (user_id = auth.uid());

-- 更新权限:仅能修改自己创建的内容
CREATE POLICY "Allow users to update own posts" ON public.posts
FOR UPDATE USING (user_id = auth.uid());

-- 删除权限:仅能删除自己创建的内容
CREATE POLICY "Allow users to delete own posts" ON public.posts
FOR DELETE USING (user_id = auth.uid());

该方案完全适配PostgREST的请求逻辑:用户通过PostgREST接口提交插入请求时,只要请求头携带了合法的用户JWT,auth.uid()就会自动解析出对应的用户ID完成填充。即使用户主动在请求体中传入user_id参数,也会被权限规则拦截或被触发器覆盖,不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:36:04