更改PostgreSQL中组角色的默认权限

jul*_*ria 20 postgresql privileges roles postgresql-9.2

我在Postgres 9.2中创建了两个组角色:一个被调用admins,另一个被调用readers.

这个想法很简单:admins创建表并readers具有对这些表的读访问权.

在为两个组角色授予权限后,所有内容都按预期为exisintg对象工作.但是现在新物体怎么样?

所以在阅读这篇文章之后,我改变了默认SELECT权限,readers为任何admins创建的新表授予权限:

ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON TABLES TO readers;
ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON SEQUENCES TO readers;
Run Code Online (Sandbox Code Playgroud)

但显然,ALTER DEFAULT PRIVILEGES只影响角色本身而不影响角色的成员.让我演示给你看.

如果我以userX(成员admins)身份登录并创建新表,则不会授予默认权限(因此readers无法访问此表):

test=# CREATE TABLE table1 (name VARCHAR(10)); -- Creating table as userX
test=# \dp table1
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 public | table1 | table |                   | 
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建表(可以访问此表),则授予默认权限:adminsreaders

test=# SET ROLE admins;
test=# CREATE TABLE table2 (name VARCHAR(10)); -- Creating table as admins
test=# \dp table2
                             Access privileges
 Schema |  Name  | Type  |   Access privileges   | Column access privileges 
--------+--------+-------+-----------------------+--------------------------
 public | table2 | table | readers=r/admins     +| 
        |        |       | admins=arwdDxt/admins | 
Run Code Online (Sandbox Code Playgroud)

有没有办法改变组角色的所有成员的默认权限?或者我应该只更改每个用户的默认权限?


更新: 在这个PostgreSQL论坛中,有人问了一个非常相似的问题,答案是:

不幸的是,如果不向所有相关人员授予默认权限,我无法找到实现目标的方法.

然而这个问题在2年前被问到过.现在有解决方案吗?

Pat*_*ick 16

如果用户创建表,则该用户将成为表的所有者.因此,在您的情况下,userX的任何默认权限都适用,而不是管理员的默认权限.解决方案是SET ROLE admins在创建表之前:

SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;
Run Code Online (Sandbox Code Playgroud)

更一般地说,您可能希望始终这样做:通过组角色或日常操作中未使用的其他角色创建所有表和视图,并将关系授予对另一个组角色的访问权限,该角色的权限由常规登录角色(用户)继承).这极大地促进了安全管理.

干杯,帕特里克

  • 很有帮助!只是为了重温这一点 - 对我而言,关键在于:"你可以只为那些将由你自己或你所属的角色创建的对象更改默认权限." 所以,'ALTER DEFAULT PRIVILEGES'确实意味着`ALTER DEFAULT PRIVILEGES - (对当前用户创建的对象) (3认同)