【问题标题】:Revoke execute privileges on insertion functions in PostgreSQL撤销 PostgreSQL 中插入函数的执行权限
【发布时间】:2017-06-01 12:23:40
【问题描述】:

我有一个角色为viewer的数据库:

CREATE ROLE viewer WITH NOSUPERUSER NOCREATEDB NOCREATEROLE;

还有称为 i 的数据库模式(对于 ininterface)。 schemai中有插入函数,即:

SELECT * FROM i.insert_machine(1,2,3);

在表 data.machine 中插入新行。还有一些非插入功能,例如i.error_table(integer) 应该允许用户查看器执行。资助选项是:

GRANT USAGE ON SCHEMA i TO viewer;
GRANT SELECT ON ALL TABLES IN SCHEMA i TO viewer;

我想禁止用户查看器调用这些 insert_* 方法。我该怎么做?如果我同时尝试:

REVOKE ALL ON FUNCTION i.insert_machine(int, int, int) FROM viewer;
REVOKE EXECUTE ON FUNCTION i.insert_machine(int, int, int) FROM viewer;

我仍然能够运行此方法并获得结果。

【问题讨论】:

    标签: postgresql sql-grant


    【解决方案1】:

    我想我已经找到了。我必须撤销 public 的执行权限,并且只选择特定角色:

    REVOKE EXECUTE ON FUNCTION i.insert_machine(integer, integer, integer) FROM public;
    GRANT EXECUTE ON FUNCTION i.insert_machine(integer, integer, integer) TO writer;
    

    【讨论】:

      【解决方案2】:

      将所有者更改为不同的角色。现在一定是eventviewer

      【讨论】:

      • 嗯,我的错,我到处都在使用查看器。固定。
      • 我的意思是这个函数的所有者要么是viewer 角色(或任何你想撤销的执行),要么所有者被授予viewer 角色。在这种情况下,更改此角色的权限将无效,因为所有者可以更改自己的对象,因此 postgres 默认授予权限。
      • 所有表和函数都是由 postgres 用户创建的。 GRANT 和 REVOKE 也由 postgres 用户完成。现在我以 viewer 用户身份连接,我仍然能够执行这些功能。也许我只是不理解你的意思。
      • 此 SQL 是否返回任何行?如果是,有什么角色标识? select roleid::regrole, member::regrole, grantor::regrole from pg_auth_members where member = 'viewer'::regrole::oid
      • 我想我明白你的想法。我从公共中删除了授权并将它们添加到特定用户,现在它可以工作了。
      猜你喜欢
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 2016-06-05
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多