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

Posted

技术标签:

【中文标题】更改 PostgreSQL 中组角色的默认权限【英文标题】:Alter default privileges for a group role in PostgreSQL 【发布时间】:2014-02-26 03:36:27 【问题描述】:

我在 Postgres 9.2 中创建了两个组角色:一个称为 admins,另一个称为 readers

想法很简单:admins 创建表,readers 对这些表具有读取权限。

在为两个组角色授予权限后,现有对象的一切都按预期工作。但是现在新对象呢?

所以在阅读了这个post 之后,我更改了默认权限,将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;

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

如果我以userXadmins 的成员)身份登录并创建一个新表,不会授予默认权限(因此,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 |                   | 

但是,如果我将表创建为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 | 

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


更新: In this PostgreSQL forum someone asked a very similar question 答案是:

很遗憾,如果不向所有相关人员授予默认权限,我无法找到实现您想要的方法。

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

【问题讨论】:

我也试图实现这一点,但我认为这可能会导致某种钻石问题。如果用户是多个组角色的成员,应授予哪些默认权限? 尝试非常相似的事情,但也涉及 SCHEMA 和 VIEWS,授予 the_reader SELECT 权限,以供将来创建的 VIEW(s) dba.stackexchange.com/questions/238766/… 使用。在我的情况下,我只使用用户(而不是组),并使用模式作为“用户空间”,管理员可以在其中编写任何视图。 【参考方案1】:

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

SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;

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

干杯, 帕特里克

【讨论】:

非常有帮助!只是为了背负这一点-对我来说,症结在于这一行:“您只能更改将由您自己或您所属的角色创建的对象的默认权限。”所以真的,ALTER DEFAULT PRIVILEGES 真的意味着ALTER DEFAULT PRIVILEGES --(on objects created by the current user)

以上是关于更改 PostgreSQL 中组角色的默认权限的主要内容,如果未能解决你的问题,请参考以下文章

postgresql用户管理

Acl-cakePHP 中组的通用权限

PostgreSQL-2-用户权限管理

postgresql学习笔记角色

postgresql 权限详解

PostgreSQL之用户角色权限管理