【问题标题】:How postgresql give permission what execute a function in schema to userpostgresql 如何授予用户在模式中执行函数的权限
【发布时间】:2018-10-08 19:54:58
【问题描述】:

我有一个名为schema.func 的函数,我想授予用户执行schema.func 的权限。

我尝试使用

GRANT EXECUTE ON schema.func to my_user;

但它不起作用。当我执行此功能时,它会引发错误:

架构 ex 的权限被拒绝

我知道我可以使用GRANT USAGE ON SCHEMA,但这不是我想要的,我只需要特定功能的权限,而不是架构中的所有功能。

我可以这样做吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    首先,您应该允许my_user 访问其他架构:

    GRANT USAGE ON SCHEMA my_schema TO my_user;
    

    这允许执行函数但不允许访问表。因此,如果my_user 执行该函数,如果该函数访问my_schema 中的表等,它仍然会产生访问错误。为避免这种情况,您可以将您的函数定义为security definer

    ALTER FUNCTION my_schema.my_function(...) SECURITY DEFINER SET search_path = public;
    

    编辑:Writing SECURITY DEFINER Functions Safely 还指出了一种授予特定用户执行权限的方法:

    REVOKE ALL ON FUNCTION my_schema.my_function(...) FROM PUBLIC;
    GRANT EXECUTE ON FUNCTION my_schema.my_function(...) TO my_user;
    

    还请注意本节中有关设置search_path 的提示。

    【讨论】:

    • 我已经将函数定义为安全定义器,但是当我使用GRANT EXECUTE ON schema.func to my_user; 时它仍然抛出权限被拒绝。我可以允许特定功能 my_user 访问而不是整个架构吗?
    • 访问该功能的权限通常不是问题。问题是对函数使用的数据库对象(表等)的访问。 AFIK 无法允许详细访问功能,但也许您可以为每个访问组使用不同的方案。
    • 谢谢。你有没有机会提到search_path
    【解决方案2】:

    根据 PostregSQL 文档 GRANT

    FUNCTION 语法适用于普通函数、聚合函数和窗口函数,但不适用于过程;对这些使用 PROCEDURE。或者,使用 ROUTINE 来指代函数、聚合函数、窗口函数或过程,无论其精确类型如何。 ... ALL FUNCTIONS 也影响聚合函数和窗口函数,但不影响过程,就像特定对象 GRANT 命令一样。使用ALL ROUTINES来包含程序。

    尝试:

    GRANT EXECUTE ON ROUTINE my_schema.my_function(text) TO my_user;
    

    假设你的函数签名是这样的:

    my_schema.my_function(my_par text)
    

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多