PostgreSQL 权限解释

问题描述 投票:0回答:2

请解释 PostgreSQL 中

\z
命令的输出。我理解许可,我阅读了文档,但不知何故我错过了
\z
输出的解释。

datastore_default=> \z

                                    Access privileges
 Schema |      Name       | Type  |         Access privileges         | Column access privileges 
--------+-----------------+-------+-----------------------------------+--------------------------
 public | _table_metadata | view  | ckan_default=arwdDxt/ckan_default+| 
        |                 |       | datastore_default=r/ckan_default +| 
        |                 |       | readonlyuser=r/ckan_default      +| 
 public | foo             | table | ckan_default=arwdDxt/ckan_default+| 
        |                 |       | datastore_default=r/ckan_default +| 
        |                 |       | readonlyuser=r/ckan_default      +| 

不知怎的,

readonlyuser
似乎能够读取表
foo
和_foo,但实际上却不能。两个命令都会返回错误:

sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM foo'
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public.foo'
ERROR:  permission denied for schema public
LINE 1: SELECT * FROM public.foo

编辑:显然我对数据库和模式权限的工作方式了解甚少。首先,只有数据库管理员(用户 postgres)或数据库所有者(在我的例子中为用户 ckan_default)可以授予其他用户对特定数据库的权限。该模式仅在数据库级别,所以我添加

readonlyuser
查看公共模式的权限是可以的,无论如何它都无法从其他数据库中进行选择。

postgresql
2个回答
56
投票

错误表示 schema public 的权限被拒绝(强调我的)

您需要授予公共架构的只读用户权限:

GRANT USAGE ON SCHEMA public TO readonlyuser;

ACL 的内容在本页有解释。这里引用了最相关的部分:

rolename=xxxx -- privileges granted to a role
        =xxxx -- privileges granted to PUBLIC

            r -- SELECT ("read")
            w -- UPDATE ("write")
            a -- INSERT ("append")
            d -- DELETE
            D -- TRUNCATE
            x -- REFERENCES
            t -- TRIGGER
            X -- EXECUTE
            U -- USAGE
            C -- CREATE
            c -- CONNECT
            T -- TEMPORARY
      arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)
            * -- grant option for preceding privilege

        /yyyy -- role that granted this privilege

+ 是 psql 格式化结果的方式的一部分,它们不是值的一部分。


0
投票

PostgreSQL 有 3 层对象(数据库、模式、对象,例如表),并且还向数据库对象所有者隐式授予

这意味着我们需要

  • 连接数据库
  • 模式上的使用(隐式提供给模式所有者)
  • 表上的 SELECT(隐式提供给表所有者)

要查看这些权限:

  • 使用
    \l+
    查看数据库的权限
  • 使用
    \dn+
    查看架构的权限
  • 使用
    \dp+
    查看表的权限

特权在这里看到

enter image description here

我们还需要了解以下格式的acl条目:

grantee=privilege-abbreviation[*]/grantor

例如在以下

\dp+
acl 示例中,
user
已被
postgres
角色

授予所有权限
user=arwdDxt/postgres

如果acl条目为空,则表示该对象具有默认所有者权限(所有权限)

如果给定对象的“被授予者”列为空,则意味着权限被授予

PUBLIC
角色(存在的每个角色)

=UC/postgres

使用公共模式时也很混乱。您对架构拥有 CREATE 权限,因此当使用同一用户创建表时,您可以选择数据,并且您拥有开箱即用的所有者权限。

此外。在执行上述任何操作之前,您必须连接到集群。这意味着使用具有

LOGIN
权限的角色并使用有效密码和 SSL 进行连接。

© www.soinside.com 2019 - 2024. All rights reserved.