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
相关产品推荐
相关产品推荐

