Saya bertanya-tanya mengapa pengguna yang baru dibuat diizinkan untuk membuat tabel setelah terhubung ke database. Saya memiliki satu database, 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)
Sejauh ini baik. Sekarang saya membuat pengguna:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Baik. Ketika saya mencoba terhubung ke database, pengguna tidak diizinkan untuk melakukannya:
$ 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.
Ini yang saya harapkan. Sekarang hal-hal aneh dimulai. Saya memberikan pengguna 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)
Dan tanpa hibah lebih lanjut, pengguna diizinkan untuk membuat tabel:
$ 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)
Saya berharap bahwa pengguna tidak diizinkan untuk melakukan apa pun sebelum saya secara eksplisit melakukannya GRANT USAGE
pada skema dan kemudian GRANT SELECT
pada tabel.
Di mana kesalahan saya? Apa yang saya lakukan salah? Bagaimana saya bisa mencapai apa yang saya inginkan (bahwa pengguna baru tidak diizinkan melakukan apa pun sebelum secara eksplisit memberinya hak yang sesuai.
Saya tersesat, dan bantuan Anda sangat dihargai :)
EDIT Mengikuti saran dari @ daniel-verite, saya sekarang membatalkan semua segera setelah membuat database. Dietrich pengguna tidak diizinkan membuat tabel lagi. Baik. TETAPI : Sekarang, juga pemilik basis data, project2 , tidak diperbolehkan membuat tabel. Bahkan setelah mengeluarkan GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
dan GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, saya mendapatkan galat ERROR: tidak ada skema yang dipilih untuk dibuat , dan ketika saya mencoba secara khusus CREATE TABLE public.WHATEVER ();
, saya mendapatkan ERROR: izin ditolak untuk skema publik . Apa yang saya lakukan salah?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. mengapa ini tidak berpengaruh?