Je me demande pourquoi un utilisateur nouvellement créé est autorisé à créer une table après s'être connecté à une base de données. J'ai une base de données 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)
Jusqu'ici tout va bien. Maintenant je crée un utilisateur:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
D'accord. Lorsque j'essaie de me connecter à la base de données, l'utilisateur n'est pas autorisé à le faire:
$ 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.
C'est ce à quoi je m'attendais. Maintenant, les choses étranges commencent. J'accorde à l'utilisateur 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)
Et sans autre subvention, l'utilisateur est autorisé à créer une table:
$ 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)
Je me serais attendu à ce que l'utilisateur ne soit pas autorisé à faire quoi que ce soit avant que je ne GRANT USAGE
le fasse explicitement sur le schéma, puis GRANT SELECT
sur les tables.
Où est mon erreur? Qu'est-ce que je fais mal? Comment puis-je obtenir ce que je veux (qu'un nouvel utilisateur ne soit pas autorisé à faire quoi que ce soit avant de lui accorder explicitement les droits appropriés.
Je suis perdu et votre aide est grandement appréciée :)
EDITER Suite aux conseils de @ daniel-verite, je reprends tout immédiatement après la création de la base de données. L'utilisateur dietrich n'est plus autorisé à créer une table. Bien. MAIS : Maintenant, le propriétaire de la base de données, project2 , n'est pas autorisé à créer une table. Même après l’émission GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
et GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, j’obtiens une erreur ERROR: aucun schéma n’a été sélectionné pour créer , et lorsque j’essaie précisément de le faire CREATE TABLE public.WHATEVER ();
, j’obtiens ERROR: permission refusée pour le schéma public . Qu'est-ce que je fais mal?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. pourquoi cela n'a-t-il eu aucun effet?