什么GRANT使用SCHEMA准确地做?

我试图创build一个Postgres数据库,所以这可能是一个愚蠢的问题。 我分配了基本的只读权限的数据库angular色,必须从我的PHP脚本访问数据库,我有一个好奇心:如果我执行

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role; 

有没有需要执行也

 GRANT USAGE ON SCHEMA schema TO role; 

从文档 :

用法:对于模式,允许访问包含在指定模式中的对象(假设对象自己的特权要求也被满足)。 本质上这允许被授权者在模式中“查找”对象。

我认为,如果我可以select或操纵模式中包含的任何数据,我可以访问模式本身的任何对象。 我错了吗? 如果不是,那么GRANT USAGE ON SCHEMA上使用哪些GRANT USAGE ON SCHEMA ? 那么这个文档究竟意味着什么呢?“假设对象本身的特权要求也得到了满足”?

GRANT不同的对象是分开的。 授予数据库不授予其中的模式的权利。 类似地,授予模式不会授予其中的表的权限。

如果您有权从表中SELECT ,但不能在包含它的模式中查看它,则无法访问表。

权利testing按顺序完成:

 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架构默认授予angular色public的所有权利(每个用户/组都是其成员)。 所以每个人都已经有了这个模式的用法。

阶段:

(假设也满足对象自己的特权要求)

是说你必须在架构上使用USAGE来使用架构中的对象,但是在架构上USAGE并不足以使用架构中的对象,您还必须拥有对象本身的权限。

这就像一个目录树。 如果你创build一个目录somedir并在其中包含文件somefile ,那么设置它,以便只有你自己的用户可以访问目录或文件(模式rwx------在dir,mode rw------- on该文件),那么没有其他人可以列出目录,看到该文件存在。

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

如果你在目录上设置了rwx-r-xr-x ,设置它,这样人们可以列出和遍历目录,但不能更改文件的权限,人们可以列出文件,但不能读取它,因为他们不能访问文件。

您需要为人们设置两个权限才能查看该文件。

同样的事情在Pg。 您需要架构USAGE权限和对象权限来对对象执行操作,例如从表中SELECT

(比较起来,PostgreSQL没有行级安全性,所以用户仍然可以通过直接从pg_class SELECT来“看到”表中存在的表,它们不能在不pipe怎样,只是“列表”部分不完全相同。)

对于生产系统,您可以使用此configuration:

 --ACCESS DB REVOKE CONNECT ON DATABASE nova FROM PUBLIC; GRANT CONNECT ON DATABASE nova TO user; --ACCESS SCHEMA REVOKE ALL ON SCHEMA public FROM PUBLIC; GRANT USAGE ON SCHEMA public TO user; --ACCESS TABLES REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only ; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ; GRANT ALL ON ALL TABLES IN SCHEMA public TO admin ;