我正在尝试首次创建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/