我正在尝试首次创建Postgres数据库,因此这可能是一个愚蠢的问题。我为db角色分配了基本的只读权限,该角色必须从我的php脚本访问数据库,并且我有一个好奇心:如果执行

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

有没有必要执行
GRANT USAGE ON SCHEMA schema TO role;



documentation:



我认为,如果我可以选择或操作架构中包含的任何数据,则可以访问架构本身的任何对象。我错了吗?如果不是,使用什么GRANT USAGE ON SCHEMA?该文档对“假设还满足对象自身的特权要求”究竟意味着什么?

最佳答案

不同对象上的GRANT是分开的。数据库上的GRANT编码对其中的架构没有GRANT权限。类似地,在模式上的GRANT不会授予其中表的权限。

如果您有权从表中访问SELECT,但无权在包含它的模式中查看它,那么您将无法访问该表。

权限测试按顺序进行:

Do you have `USAGE` on the schema?
    No:  Reject access.
    Yes: Do you also have the appropriate rights on the table?
        No:  Reject access.
        Yes: Check column privileges.

您可能会感到困惑,是因为public模式具有默认GRANT,该默认public拥有角色USAGE的所有权限,每个用户/组都是该角色的成员。因此,每个人都已经在该架构上使用过。

词组:



就是说您必须在架构上使用USAGE才能使用其中的对象,但是在架构上使用somedir本身不足以使用架构中的对象,您还必须对对象本身具有权限。

就像目录树一样。如果您在其中创建一个带有文件somefile的目录rwx------,然后对其进行设置,以便只有您自己的用户才能访问该目录或文件(在目录上为rw-------模式,在文件上为rw-r--r--模式),那么没有其他人可以列出目录以查看该目录或文件。该文件存在。

如果您要授予文件世界读权限(模式rwx-r-xr-x),但不更改目录权限,则没有任何区别。没有人可以看到文件来读取它,因为他们没有列出目录的权限。

如果您改为在目录上设置USAGE,对其进行设置,以便人们可以列出和遍历该目录但不更改文件许可权,那么人们可以列出该文件,但由于无法访问该文件而无法读取。

您需要同时设置两个权限,以使人们能够实际查看文件。

在Pg中也是一样。您需要模式SELECT权限和对象权限,才能对对象执行操作,例如表中的SELECT

(类比下降了一点,因为PostgreSQL还没有行级安全性,因此用户仍然可以通过直接从pg_class进行ojit_code来“看到”该表存在于模式中。他们无法在其中与之交互但是,无论如何,只是“列表”部分并不完全相同。)

关于database - SCHEMA上有什么格兰特用途?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17338621/

10-12 01:05