PostgreSQL:拒绝关联关系


14

我对在PostgreSQL中设置权限有些困惑。

我有以下角色:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

和数据库:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

用户myapp在查询myapp_production数据库添加和删除记录时没有问题。我meltemi也希望能够查询相同的数据库。因此,我创建了一个角色rails,该角色拥有数据库,并成为meltemi和的myapp成员rails。但是我仍然会permission denied for relation出错。Meltemi可以查看架构,但不能查询数据库。

我刚刚注意到(使用\dt命令)myapp表的所​​有者:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

这些表是通过ORM(Rails的ActiveRecord迁移)创建的。

我知道PostgreSQL中的授权非常不同(与MySQL和我使用的其他版本相对)。我应该如何设置数据库,以便不同的用户可以访问它。有些应该可以进行增删改查,但其他一些则只能阅读等。

谢谢你的帮助。抱歉,我知道这是一个非常基本的问题,但我自己找不到答案。

Answers:


4

我刚刚在将Postgresql数据库的权限授予 ServerFault 上的另一个用户的答案中写下了这一点。

基本上,当您只有一个用户并且想要授予其他用户相同的权限时,最好的解决方案是将该用户变成一个组,创建一个与该组成员中的原始用户同名的新用户,以及将该组也授予其他用户。

因此,在您的情况下,rails将其重命名为myapp_users,然后创建一个名为rails和的新登录角色(用户)GRANT myapp_users TO rails。现在你GRANT myapp_users TO meltemi。现在,新rails帐户和meltemi用户都具有旧rails帐户的权限。

为了获得更细粒度的控制,我通常建议您避免授予日常登录用户或他们的表的组所有权。通过NOINHERIT他们必须显式访问的组来授予他们访问权限SET GROUP,或者更好地,使用完全不同的用户来执行特权操作,例如DDL和GRANT。不幸的是,这不适用于Rails,因为Rails喜欢在需要的时候应用迁移,并且AFAIK不能让您指定另一个更具特权的用户来运行迁移。


好,请阅读您链接到的帖子;非常有帮助!现在,如果我理解正确的话,我想您可能打算使用myapp而不是rails上面的内容?因为myapp拥有表(我从未指定过,所以迁移必须具有)。无论如何,这将八九不离十意义,如果我改名myappmyapp_group,然后做了一个新的用户myapp将Rails应用程序将用于连接到数据库。Make myapp和现有meltemi,均为myapp_group角色成员。但是,当我运行下一个迁移时会发生什么。通过myapp重新创建问题来拥有它吗?!?
Meltemi 2012年

1
您必须了解PostgreSQL仅具有roles(自版本8.1起)。这些术语usergroup出于历史原因和兼容性而保留。基本上,“组”是没有登录特权的角色。您可以授予myappmeltemi哪怕myapp只是另一个“用户”。从这里阅读手册开始
Erwin Brandstetter,2012年

我确实了解Postgres中的rolesvs groupsvs users分离,至少我认为是这样。抱歉,使用上面的错误(且令人困惑)的术语。但是我仍然不知道如何设置数据库,因此无登录角色拥有该数据库和两个登录角色myappmeltemi并且都具有完全访问权限。这些角色之一myapp将是运行Rails迁移,它将不可避免地创建新的表,这些表再次由myapp登录用户拥有。我是否应该成为它meltemi的“成员” myapp并完成它?但这似乎有点糊涂……不?!?
Meltemi 2012年

1
@Meltemi:如果您想授予所有myapp持有的特权,meltemi那将是正确的选择。如果您只想meltemi获取特权的子集,则不会。然后创建一个组角色来保存特权集并将其授予meltemi。您最可能对SO上的这个相关问题感兴趣。我回答了解释DEFAULT PRIVILEGES
Erwin Brandstetter

@Meltemi是的,和往常一样,Rails迁移使情况复杂化了。Rails确实应该让您指定其他用户帐户来运行迁移。您可以SET ROLE在迁移开始时添加一个命令,在迁移RESET ROLE结束时添加一个命令,但是我不相信Rails可以按顺序整洁地运行整个过程。欧文的权利;在这种情况下,最好的解决方法是将GRANT第一个用户作为第二个用户的组,将用户的所有权授予其他用户。
Craig Ringer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.