Мені цікаво, чому новоствореному користувачеві дозволяється створювати таблицю після підключення до бази даних. У мене є одна база даних 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, я відкликаю все одразу після створення бази даних. Користувачеві дієтич більше не дозволяється створювати таблицю. Добре. АЛЕ : Тепер також власнику бази даних project2 заборонено створювати таблицю. Навіть після видачі GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
і GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, я отримую помилку ПОМИЛКА: для створення в ньому не обрано жодної схеми , і коли я спеціально намагаюся CREATE TABLE public.WHATEVER ();
, я отримую ERROR: дозволу відмовлено для загальнодоступних схем . Що я роблю неправильно?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. чому це не мало жодного ефекту?