為什麼允許新使用者創建表?
我想知道為什麼允許新創建的使用者在連接到數據庫後創建表。我有一個數據庫,
project2_core
:postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ---------------+--------------+-----------+-------------+-------------+------------------------------- postgres | postgres | SQL_ASCII | C | C | project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2 template0 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
到目前為止,一切都很好。現在我創建一個使用者:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
好的。當我嘗試連接到數據庫時,不允許使用者這樣做:
$ psql -h localhost -p 5432 -U dietrich -W project2_core Password for user dietrich: psql: FATAL: permission denied for database "project2_core" DETAIL: User does not have CONNECT privilege.
這是我所期望的。現在奇怪的事情開始了。我授予使用者
CONNECT
:postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich; GRANT postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ---------------+--------------+-----------+-------------+-------------+------------------------------- postgres | postgres | SQL_ASCII | C | C | project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+ | | | | | dietrich=c/project2 template0 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
並且無需任何進一步的授權,使用者就可以創建一個表:
$ psql -h localhost -p 5432 -U dietrich -W project2_core Password for user dietrich: psql (9.2.3) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. project2_core=> create table adsf (); CREATE TABLE project2_core=> \d List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | adsf | table | dietrich (1 row)
GRANT USAGE
我本來希望在我明確地對模式然後GRANT SELECT
對錶執行任何操作之前,不允許使用者執行任何操作。我的錯誤在哪裡?我究竟做錯了什麼?我怎樣才能實現我想要的(在明確授予她適當的權限之前,不允許新使用者做任何事情。
我迷路了,非常感謝您的幫助:)
編輯按照@daniel-verite 的建議,我現在在創建數據庫後立即撤銷所有內容。使用者dietrich不再被允許創建表。好的。但是:現在,數據庫的所有者project2也不允許創建表。即使在發出
GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
and之後GRANT ALL PRIVILEGES ON SCHEMA public TO project2
,我也會收到錯誤ERROR: no schema has been selected to create in,當我特別嘗試這樣做時CREATE TABLE public.WHATEVER ();
,我會收到ERROR: permission denied for schema public。我究竟做錯了什麼?
創建新數據庫時,允許任何角色在
public
模式中創建對象。要消除這種可能性,您可以在創建數據庫後立即發出:REVOKE ALL ON schema public FROM public;
編輯:在上述命令之後,只有超級使用者可以在
public
模式內創建新對象,這是不切實際的。foo_user
假設應授予非超級使用者此權限,應通過以下方式完成:GRANT ALL ON schema public TO foo_user;
要了解
ALL
模式的含義,我們必須參考文件中的 GRANT(在 PG 9.2 中,有不少於 14 種形式的 GRANT 語句適用於不同的事物……)。似乎對於模式來說,它意味著CREATE
和USAGE
。另一方面,
GRANT ALL PRIVILEGES ON DATABASE...
將授予CONNECT
andCREATE
和TEMP
,但CREATE
在此上下文中涉及模式,而不是永久表。關於這個錯誤:
ERROR: no schema has been selected to create in
,當試圖創建一個沒有模式限定的對象時(如create table foo(...)
),而缺乏在search_path
.