我在Postgres 9.2中创建了两个组角色:一个名为admins
,另一个名为readers
。
这个想法非常简单:admins
创建表,readers
具有对这些表的读访问权。
在为两个组角色授予权限后,所有内容都按预期为exisintg对象工作。但是现在新物体呢?
因此,在阅读此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年前被问到过。现在有解决方案吗?
答案 0 :(得分:16)
如果用户创建表,则该用户将成为表的所有者。因此,在您的情况下,userX的任何默认权限都适用,而不是管理员的默认权限。在创建表之前,解决方案是SET ROLE admins
:
SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;
更一般地说,您可能希望始终这样做:通过组角色或日常操作中未使用的其他角色创建所有表和视图,并授予对通过常规登录继承权限的另一个组角色的关系的访问权限角色(用户)。这极大地促进了安全管理。
干杯, 帕特里克