ฉันสงสัยว่าทำไมผู้ใช้ที่เพิ่งสร้างใหม่ได้รับอนุญาตให้สร้างตารางหลังจากเชื่อมต่อกับฐานข้อมูล ฉันมีฐานข้อมูลเดียว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
และGRANT ALL PRIVILEGES ON SCHEMA public TO project2
ฉันได้รับข้อผิดพลาดข้อผิดพลาด: ไม่มีสคีได้รับเลือกที่จะสร้างในและเมื่อฉันเฉพาะพยายามที่จะCREATE TABLE public.WHATEVER ();
ฉันได้รับข้อผิดพลาด: อนุญาตปฏิเสธสำหรับสคีสาธารณะ ผมทำอะไรผิดหรือเปล่า?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
ฉันพยายามแล้ว ทำไมสิ่งนี้ถึงไม่มีผลอะไรเลย?