【问题标题】:Grant default privileges for specific database in Postgres在 Postgres 中为特定数据库授予默认权限
【发布时间】:2019-03-30 13:25:36
【问题描述】:

我有一个名为funnycode 的数据库。我还有一个用户叫funnycode_user

如何将默认权限授予funnycode_user,以便用户可以:

  1. 创建一个名为funnycode的数据库。
  2. 用户可以连接到名称为funnycode 的任何未来数据库,但不能连接到其他数据库。
  3. 用户可以从所有表中进行选择,并且可以访问名称为 funnycode 的任何未来数据库中的所有序列,但不能访问其他数据库。

这在 Postgres 中可行吗?如果是这样,怎么做?我read the documentation here,但我不明白这是怎么回事:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT INSERT ON TABLES TO funnycode_user;

是否绑定到特定数据库,在我的情况下是 funnycode 数据库?

【问题讨论】:

    标签: postgresql privileges


    【解决方案1】:

    创建数据库的用户自动拥有该数据库(除非指定了不同的所有者),因此自动拥有该数据库的所有权限。您不需要任何额外的授权来启用该用户在数据库中创建和使用表。

    所以如果你给funnycode_usercreate database 权限,他可以创建他想要的任何数据库,而不仅仅是funnycode。没有办法阻止这种情况。

    创建的每个新数据库都会自动将connect 权限授予角色public。如果您不希望funnycode_user 连接到其他数据库,则需要从每个数据库的公共角色中撤消该权限。

    另一种限制特定用户访问特定数据库的方法是通过pg_hba.conf

    你需要这样的条目:

    # TYPE  DATABASE        USER              ADDRESS        METHOD
    host    funnycode       funnycode_user    0.0.0.0/0      md5
    

    条目0.0.0.0/0 表示funnycode_user 可以从任何IP 地址连接。即使funnycode_user创建了其他数据库,他也无法连接到它们。


    我认为更好(更简洁)的方法是授予该用户创建数据库的权限。只需创建一次该数据库,将 funnycode_user 设为所有者即可。

    例如作为超级用户运行:

    create user funnycode_user password 'VerySecret';
    create database funnycode owner = funnycode_user;
    

    您只需要执行一次(或在 funnycode_user 决定删除数据库之后),并且您不需要授予 funnycode_user 创建数据库的权限。

    【讨论】:

    • 只是为了澄清。您是说如果我让funnycode_user 成为特定数据库的所有者,那么我就不需要去授予该用户访问表和序列的权限了吗?因为作为数据库的所有者,该用户已经拥有这些权限?
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2016-03-13
    • 2017-08-07
    • 2015-12-07
    • 2016-08-10
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多