【问题标题】:Why Postgres does not grant EXECUTE on function to PUBLIC as documented?为什么 Postgres 不向 PUBLIC 授予 EXECUTE 功能?
【发布时间】:2019-01-24 08:54:55
【问题描述】:

Documentation 说:

对于其他类型的对象,授予 PUBLIC 的默认权限如下: 数据库的 CONNECT 和 TEMPORARY(创建临时表)权限;函数的 EXECUTE 特权;语言和数据类型(包括域)的 USAGE 权限。

我执行:

create user test_user password 'test_user';
grant create on database "NLP" to test_user;

然后我在这个用户下连接并执行:

create schema s;
create function s.f() returns void as $$begin null; end;$$ language plpgsql;

我希望 EXECUTE 将被授予函数上的 PUBLIC,但这不会发生。为什么?

此外,我发现了一件奇怪的事情。如果我更改架构的默认函数权限,则该机制开始工作。

create role test_role;

test_user下:

alter default privileges in schema s grant execute on functions to test_role;
create function s.x() returns void as $$begin null; end;$$ language plpgsql;

瞧!除了在x() 上为test_role 执行之外,我还为公共执行了!

我的数据库报告version()

PostgreSQL 10.3 (Ubuntu 10.3-1.pgdg14.04+1) on x86_64-pc-linux-gnu,
compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4, 64-bit

我的数据库有问题吗?我在另一个数据库(相同的version())上对其进行了测试,得到了相同的结果。

【问题讨论】:

  • 我无法重现。请说明您是如何确定PUBLICs.f() 上没有EXECUTE 权限的。
  • @LaurenzAlbe 最初我在 pgAdmin 生成的反向对象定义中查看它,另外我使用来自这个问题的pg_functions_grants 之类的查询验证了这一点:stackoverflow.com/questions/51850833/… 两种方法都显示相同:f() 确实除了所有者之外没有任何特权,并且x() 已将 X 授予 test_role 和 PUBLIC。
  • SELECT has_function_privilege('laurenz', 's.f()', 'EXECUTE'); 给了我TRUESELECT dp.defaclrole::regrole, dp.defaclnamespace::regnamespace, dp.defaclobjtype, acl.grantor::regrole, acl.grantee::regrole, acl.privilege_type FROM pg_default_acl AS dp CROSS JOIN LATERAL aclexplode(dp.defaclacl) AS acl; 得到什么?
  • 另外,您能否展示您用来确定PUBLIC 不能EXECUTE确切 语句及其结果?
  • 所以这是一个误会。很好。

标签: postgresql database-administration grant postgresql-10


【解决方案1】:

回答我自己的问题。一切都按预期工作,但我误解了 pgAdmin 的指示。

select proacl from pg_proc where proname = 'f'

给出NULL,根据documentation

如果给定对象的“访问权限”列为空,则表示该对象具有默认权限(即,其权限列为空)。默认权限始终包括所有者的所有权限,并且可以根据对象类型包括一些 PUBLIC 权限,如上所述。

对于像函数这样的对象类型,它假定为 PUBLIC 执行(正如我在最初的问题中发布的那样)。

用户的有效权限也可以通过(感谢 Laurenz)方便地测试:

select has_function_privilege('username', 's.f()', 'EXECUTE');

这为任何用户提供了TRUE

pgAdming 在一种情况下为 PUBLIC 生成显式授权而在另一种情况下没有生成任何内容的事实具有误导性。没有授予 PUBLIC 并不一定意味着 PUBLIC 没有权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2020-02-03
    • 2011-12-31
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多