postgresql – 为什么允许新用户创建表?

前端之家收集整理的这篇文章主要介绍了postgresql – 为什么允许新用户创建表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道为什么允许新创建的用户在连接到数据库后创建表.我有一个数据库,project2_core:
  1. postgres=# \l
  2. List of databases
  3. Name | Owner | Encoding | Collate | Ctype | Access privileges
  4. ---------------+--------------+-----------+-------------+-------------+-------------------------------
  5. postgres | postgres | sql_ASCII | C | C |
  6. project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
  7. template0 | postgres | sql_ASCII | C | C | =c/postgres +
  8. | | | | | postgres=CTc/postgres
  9. template1 | postgres | sql_ASCII | C | C | =c/postgres +
  10. | | | | | postgres=CTc/postgres
  11. (5 rows)

到现在为止还挺好.现在我创建一个用户

  1. postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER

好的.当我尝试连接到数据库时,不允许用户这样做:

  1. $psql -h localhost -p 5432 -U dietrich -W project2_core
  2. Password for user dietrich:
  3. psql: FATAL: permission denied for database "project2_core"
  4. DETAIL: User does not have CONNECT privilege.

这是我的预期.现在奇怪的东西开始了.我授予用户CONNECT:

  1. postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
  2. GRANT
  3. postgres=# \l
  4. List of databases
  5. Name | Owner | Encoding | Collate | Ctype | Access privileges
  6. ---------------+--------------+-----------+-------------+-------------+-------------------------------
  7. postgres | postgres | sql_ASCII | C | C |
  8. project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
  9. | | | | | dietrich=c/project2
  10. template0 | postgres | sql_ASCII | C | C | =c/postgres +
  11. | | | | | postgres=CTc/postgres
  12. template1 | postgres | sql_ASCII | C | C | =c/postgres +
  13. | | | | | postgres=CTc/postgres
  14. (5 rows)

在没有任何进一步授权的情况下,允许用户创建表:

  1. $psql -h localhost -p 5432 -U dietrich -W project2_core
  2. Password for user dietrich:
  3. psql (9.2.3)
  4. SSL connection (cipher: DHE-RSA-AES256-SHA,bits: 256)
  5. Type "help" for help.
  6.  
  7. project2_core=> create table adsf ();
  8. CREATE TABLE
  9. project2_core=> \d
  10. List of relations
  11. Schema | Name | Type | Owner
  12. --------+------+-------+----------
  13. public | adsf | table | dietrich
  14. (1 row)

在我明确地对模式进行GRANT USAGE然后在表上进行GRANT SELECT之前,我原本以为不允许用户做任何事情.

我的错误在哪里?我究竟做错了什么?我怎样才能实现我想要的(在明确授予她适当权利之前,不允许新用户做任何事情.

我迷路了,非常感谢你的帮助:)

编辑按照@ daniel-verite的建议,我现在在创建数据库后立即撤销所有操作.用户dietrich不允许再创建表.好.但是:现在,也不允许数据库的所有者project2创建表.即使在数据库上发布GRANT ALL PRIVILEGES project2_core TO project2并在SCHEMA public TO project2上发布GRANT ALL PRIVILEGES,我收到错误错误:没有选择要创建的模式,以及当我专门尝试创建表时public.WHATEVER();,我得到错误:架构公众的权限被拒绝.我究竟做错了什么?

创建新数据库时,允许任何角色在公共模式中创建对象.要消除这种可能性,您可以在创建数据库后立即发出:
  1. REVOKE ALL ON schema public FROM public;

编辑:在上面的命令之后,只有超级用户可以在公共模式中创建新对象,这是不切实际的.假设应该为非超级用户foo_user授予此权限,则应该使用以下命令:

  1. GRANT ALL ON schema public TO foo_user;

要知道ALL对于模式意味着什么,我们必须参考GRANT in the doc,(在PG 9.2中,有不少于14种形式的GRANT语句适用于不同的东西……).对于模式来说,它似乎意味着CREATE和USAGE.

另一方面,GRANT ALL PRIVILEGES ON DATABASE …将授予CONNECT和CREATE和TEMP,但在此上下文中的CREATE与模式有关,而不是永久表.

关于此错误错误:没有选择要创建的模式,它在尝试创建没有模式限定的对象时发生(如在create table foo(…)中),同时缺少在任何模式中创建它的权限SEARCH_PATH.

猜你在找的Postgre SQL相关文章