Supabase 中的触发器函数权限问题:触发器调用的函数被拒绝访问

问题描述 投票:0回答:1

我在使用 Supabase 触发器和函数执行权限时遇到问题。我设置了一个触发器,在插入

auth.users
表后触发。触发器调用名为
public.handle_new_user()
的函数,该函数执行某些操作,包括将数据插入另一个表
public.profiles

这是我所做的总结:

DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;

CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
    RAISE LOG 'Current user: %', current_user;

    PERFORM public.insert_into_profiles(
        NEW.id,
        (NEW.raw_user_meta_data->>'first_name'),
        (NEW.raw_user_meta_data->>'last_name')      
    );

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.handle_new_user();

当我在 Supabase 仪表板中执行

insert_into_profiles()
时,它可以正常工作,因为它是作为
postgres
用户执行的。但是,当在
handle_new_user()
函数中以及由
INSERT
之后的触发器(由 supabase_auth_admin 触发)调用此函数时,我会遇到专门针对
public.profiles
表的“权限被拒绝”错误。

关于为什么触发器调用的函数没有所需权限的任何见解,特别是当函数本身在独立执行时工作时?

感谢您的帮助或指导!

我已经验证了

public.insert_into_profiles
函数在直接执行时可以正常工作:

SELECT public.insert_into_profiles(
    'b53e07f1-e775-4a15-b287-8a25d3525bca',
    'John',
    'Doe'
);

此命令执行没有问题。然而,在

handle_new_user()
上下文中,它似乎缺乏必要的权限。

我还删除了所有行级别安全性 (RLS) 策略,但错误仍然存在

sql database postgresql triggers supabase
1个回答
0
投票

您必须使您的函数成为安全定义器,以便它具有 Postgres 权限。

CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER
security definer
AS $$
BEGIN
    RAISE LOG 'Current user: %', current_user;

    PERFORM public.insert_into_profiles(
        NEW.id,
        (NEW.raw_user_meta_data->>'first_name'),
        (NEW.raw_user_meta_data->>'last_name')      
    );

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.