更改 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
只影响角色本身,而不影响角色的成员。让我给你看看。
如果我以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 | |
但是,如果我将表创建为admins
(readers
可以访问此表),则会授予默认权限:
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 中组角色的默认权限的主要内容,如果未能解决你的问题,请参考以下文章