postgresql Supplement中的触发器函数配置问题:触发器调用的函数的访问被拒绝

zpqajqem  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(82)

我在使用SupplyData触发器和函数执行权限时遇到了一个问题。我设置了一个触发器,在插入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();

字符串
当我在Supplement Jmeter 板中执行insert_into_profiles()时,它可以正常工作,因为它是以postgres用户身份执行的。但是,当在handle_new_user()函数中调用此函数并通过INSERT之后的触发器(由supplement_auth_admin触发)调用此函数时,我遇到专门针对public.profiles表的“permission denied”错误。
对于为什么触发器调用的函数没有所需的权限,特别是当函数本身独立执行时,有什么见解吗?
感谢您的任何帮助或指导!
我已经验证了public.insert_into_profiles函数在直接执行时可以正常工作:

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


此命令执行时没有问题。但是,在handle_new_user()上下文中,它似乎缺乏必要的权限。
此外,我已经删除了所有行级安全(RLS)策略,错误仍然存在

hpcdzsge

hpcdzsge1#

你必须让你的函数成为一个安全定义者,这样它才有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;

字符串

相关问题