Мне интересно, почему вновь созданному пользователю разрешено создавать таблицу после подключения к базе данных. У меня есть одна база данных 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
я получаю ошибку ERROR: схема не была выбрана для создания , а когда я специально пытаюсь это сделать CREATE TABLE public.WHATEVER ();
, я получаю ERROR: разрешение отклонено для общедоступной схемы . Что я делаю не так?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. почему это никак не отразилось?