在PostgreSQL中为一个组角色修改默认权限

26

我在Postgres 9.2中创建了两个组角色:adminsreaders

想法很简单:admins创建表,而readers能够读取这些表。

在将权限授予这两个组角色后,现有对象的所有内容都按预期工作。但是对于新对象呢?

因此,在阅读了这篇文章之后,我更改了默认权限,以授予readersadmins创建的任何新表的SELECT权限:

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;

但是显然,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 |                   | 

但是,如果我将表格创建为管理员读者可以访问此表),则会授予默认权限

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 | 

有没有一种方法可以改变一个组角色的所有成员的默认权限?或者我应该为每个用户更改默认权限?


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

不幸的是,我看不到任何实现您想要的目标的方法,除非将默认权限授予涉及到的每个人。

然而,这个问题是两年前提出的。现在有解决办法吗?


我也试图实现这个,但我认为这可能会导致某种钻石问题。如果用户是多个组角色的成员,应授予哪些默认特权? - Bastien
尝试类似的事情,但还涉及SCHEMA和VIEWS,授予the_reader SELECT权限,以便将来创建的VIEW(s)可以使用。在我的代码中,我只使用用户(而不是组),并且我使用一个名为“userspace”的模式,其中经理可以编写任何视图。 - Gromish
1个回答

20
如果一个用户创建了一张表,那么该用户就成为该表的所有者。所以在你的情况下,用户X的默认权限适用,而不是管理员的权限。解决方案是在创建表之前使用SET ROLE admins
SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;

总的来说,您始终希望这样做:通过组角色或其他未用于日常操作的角色创建所有表和视图,并将访问权限授予另一个组角色,其特权由普通登录角色(用户)继承。这极大地简化了安全管理。

祝好, Patrick


4
非常有帮助!只是想进一步解释一下,对我来说难以理解的是这句话:“你只能更改由你自己或你所属的角色创建的对象的默认权限。” 所以,实际上,“ALTER DEFAULT PRIVILEGES” 的意思是“ALTER DEFAULT PRIVILEGES --(针对当前用户创建的对象)”。 - wils484

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接