【问题标题】:postgresql 9.1 - access tables through functionspostgresql 9.1 - 通过函数访问表
【发布时间】:2012-03-04 03:16:38
【问题描述】:

我有 3 个角色:超级用户、超级用户和用户。我有表“数据”和函数 data_select 和 data_insert。

现在我想定义,只有超级用户才能访问表“数据”。 Poweruser 和 user 不能直接访问表“数据”,只能通过函数访问。

用户只能运行 data_select 函数,poweruser 可以运行 data_select 和 data_insert。

然后我可以创建用户 alice、bob ......并继承他们的 user 或 poweruser 权限。

这真的可以实现吗?我与这个斗争了第二天,却一无所获。

感谢您的宝贵时间。

【问题讨论】:

    标签: postgresql privileges grant


    【解决方案1】:

    是的,这是可行的。

    默认情况下,“超级用户”可以是实际的superuserpostgres。 我将普通用户的角色重命名为 usr,因为 user 是保留字 - 不要将其用作标识符。

    CREATE ROLE usr;
    CREATE ROLE poweruser;
    GRANT usr TO poweruser;  -- poweruser can do everything usr can.
    
    CREATE ROLE bob PASSWORD <password>;
    GRANT poweruser TO bob;
    
    CREATE ROLE alice PASSWORD <password>;
    GRANT usr TO alice;
    
    REVOKE ALL ON SCHEMA x FROM public;
    GRANT USAGE ON SCHEMA x TO usr;
    
    REVOKE ALL ON TABLE x FROM public;
    REVOKE ALL ON TABLE y FROM public;
    
    CREATE FUNCTION
      ...
    SECURITY DEFINER;
    
    REVOKE ALL ON FUNCTION ... FROM public;
    GRANT EXECUTE ON FUNCTION a TO usr;
    GRANT EXECUTE ON FUNCTION b TO poweruser;
    

    或者您可以创建无需登录的守护程序角色来拥有这些功能并在表上拥有相应的权限。这样会更安全。

    如果你走这条路,你会喜欢ALTER DEFAULT PRIVILEGES(在 PostgreSQL 9.0 中引入)。 More details in this related answer.

    阅读手册中的Writing SECURITY DEFINER Functions Safely章节。

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 2015-11-30
      • 2014-07-26
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2011-09-06
      相关资源
      最近更新 更多