Tôi đang tự hỏi tại sao một người dùng mới được tạo lại được phép tạo bảng sau khi kết nối với cơ sở dữ liệu. Tôi có một cơ sở dữ liệu , 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)
Càng xa càng tốt. Bây giờ tôi tạo một người dùng:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Được chứ. Khi tôi cố gắng kết nối với cơ sở dữ liệu, người dùng không được phép làm như vậy:
$ 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.
Đây là những gì tôi mong đợi. Bây giờ những thứ kỳ lạ bắt đầu. Tôi cấp cho người dùng 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)
Và không cần thêm bất kỳ khoản tài trợ nào, người dùng được phép tạo bảng:
$ 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)
Tôi đã dự kiến rằng người dùng không được phép làm bất cứ điều gì trước khi tôi làm rõ ràng GRANT USAGE
trên lược đồ và sau đó GRANT SELECT
trên các bảng.
Lỗi của tôi ở đâu? Tôi đang làm gì sai? Làm cách nào tôi có thể đạt được những gì tôi muốn (rằng người dùng mới không được phép làm bất cứ điều gì trước khi cấp cho cô ấy các quyền thích hợp một cách rõ ràng.
Tôi bị lạc, và sự giúp đỡ của bạn được đánh giá rất cao :)
EDIT Theo lời khuyên của @ daniel-verite, bây giờ tôi sẽ thu hồi tất cả ngay sau khi tạo cơ sở dữ liệu. Người ăn kiêng không được phép tạo bảng nữa. Tốt NHƯNG : Bây giờ, cũng là chủ sở hữu của cơ sở dữ liệu, project2 , không được phép tạo bảng. Ngay cả sau khi phát hành GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
và GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, tôi vẫn gặp lỗi LRI: không có lược đồ nào được chọn để tạo và khi tôi cố gắng cụ thể CREATE TABLE public.WHATEVER ();
, tôi nhận được ERROR: quyền bị từ chối đối với lược đồ công khai . Tôi đang làm gì sai?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. Tại sao điều này không có tác dụng?