Ane*_*n N 5 postgresql permissions default-value
我有一种情况,许多用户可以跨所有可用模式创建数据库对象。
所有开发人员都使用一个通用用户 pg_dump_user 在需要时将整个数据库转储到他们的本地数据库。所以这个用户应该拥有对所有数据库对象的读取权限。
为了实现这一点,我尝试在架构级别和用户级别设置默认权限。
--为每个模式设置的默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA xyz GRANT SELECT ON TABLES to ro_user';
Run Code Online (Sandbox Code Playgroud)
--为每个用户设置的默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE abc_user GRANT SELECT ON TABLES to ro_user' ;
Run Code Online (Sandbox Code Playgroud)
即使上面的设置存在,在某些时间之后这些都会消失,因为 ro_user 无法访问创建的新对象。
任何关于此的指针都会有所帮助,我的目标只是为用户实现对当前和未来所有对象的选择访问,以便执行 pg_dump。
该文件关于ALTER DEFAULT PRIVILEGES
告诉你一个可能的原因-它不是那么清楚的描述,虽然。
来看看怎么说的:
您只能更改将由您自己或您所属的角色创建的对象的默认权限。
这意味着此语句定义的默认权限仅适用于由您(或您所属的角色)创建的对象。让我们看看它的实际效果!
alice
的架构首先,我们以alice
. 然后,在新创建的模式中,我们创建一个表并授予以下权限bob
:
SELECT current_user;
current_user
??????????????
alice
SHOW search_path ;
search_path
??????????????
test, public
CREATE SCHEMA alicetest;
ALTER DEFAULT PRIVILEGES
FOR ROLE alice
IN SCHEMA alicetest
GRANT ALL ON TABLES TO alice;
GRANT SELECT ON alicetest.a TO bob;
-- this I do only for showing the privileges -
-- the owner has by default ALL and is not shown by \dp
\dp alicetest.a
Access privileges
Schema ? Name ? Type ? Access privileges ? Column access privileges
???????????????????????????????????????????????????????????????????????????
alicetest ? a ? table ? alice=arwdDxt/alice??
? ? ? bob=r/alice ?
Run Code Online (Sandbox Code Playgroud)
alice
正如预期的那样,现在她拥有所有权利。
bob
' 相同模式中的表现在,在获得对该架构的访问权限后,bob
尝试创建一个表:
SELECT current_user;
current_user
??????????????
bob
CREATE TABLE alicetest.b (id integer);
GRANT SELECT ON alicetest.b TO alice;
\dp alicetest.b
Access privileges
Schema ? Name ? Type ? Access privileges ? Column access privileges
?????????????????????????????????????????????????????????????????????????
alicetest ? b ? table ? bob=arwdDxt/bob ??
? ? ? alice=r/bob ?
Run Code Online (Sandbox Code Playgroud)
如您所见,尽管在alice
的架构中创建了表,她设置了默认权限,但bob
的表并不具有所有这些权限。发生这种情况是因为alice
它不是 的成员bob
。
让我们也检查一下这个成员资格,并尝试alice
再次定义默认权限,这次是为另一个角色:
ALTER DEFAULT PRIVILEGES
FOR ROLE charlie
IN SCHEMA alicetest
GRANT ALL ON TABLES TO alice;
ERROR: must be member of role "charlie"
Run Code Online (Sandbox Code Playgroud)
因此,某个足够强大的用户授予她 中的成员资格charlie
,然后她再次尝试,并成功:
ALTER DEFAULT PRIVILEGES
FOR ROLE charlie
IN SCHEMA alicetest
GRANT ALL ON TABLES TO alice;
ALTER DEFAULT PRIVILEGES
Run Code Online (Sandbox Code Playgroud)
charlie
的圆然后charlie
创建一个新表:
CREATE TABLE alicetest.c (id integer);
Run Code Online (Sandbox Code Playgroud)
以及特权:
\dp alicetest.c
Access privileges
Schema ? Name ? Type ? Access privileges ? Column access privileges
???????????????????????????????????????????????????????????????????????????????
alicetest ? c ? table ? charlie=arwdDxt/charlie??
? ? ? alice=arwdDxt/charlie ?
Run Code Online (Sandbox Code Playgroud)
如您所见,alice
作为 的成员charlie
, 可以访问该表。
我猜您为自己定义了默认权限(alice
在示例中),但是您的开发人员bob
在这里充当了一堆s,没有获得必要的权限。解决这个问题的一种方法(正如我们在工作中所做的那样)是做一个
SET ROLE TO schema_owner;
Run Code Online (Sandbox Code Playgroud)
每次在架构中创建新对象之前。这应该是所有开发人员都属于的角色(否则您会收到错误消息)。
注意这\dp
是一个psql
命令。
归档时间: |
|
查看次数: |
2881 次 |
最近记录: |