Zastanawiam się, dlaczego nowo utworzony użytkownik może utworzyć tabelę po połączeniu z bazą danych. Mam jedną bazę danych 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)
Na razie w porządku. Teraz tworzę użytkownika:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
W porządku. Kiedy próbuję połączyć się z bazą danych, użytkownik nie może tego zrobić:
$ 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.
Tego się spodziewałem. Teraz zaczynają się dziwne rzeczy. Przyznaję użytkownikowi 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)
I bez dalszych dotacji użytkownik może utworzyć 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)
Spodziewałbym się, że użytkownik nie będzie mógł nic zrobić, zanim jawnie zrobię to GRANT USAGE
na schemacie, a następnie GRANT SELECT
na tabelach.
Gdzie jest mój błąd? Co ja robię źle? Jak mogę osiągnąć to, czego chcę (aby nowy użytkownik nie mógł nic robić, zanim wyraźnie nada jej odpowiednie uprawnienia.
Zgubiłem się, a twoja pomoc jest bardzo mile widziana :)
EDYCJA Zgodnie z radą @ daniel-verite teraz odwołuję wszystko natychmiast po utworzeniu bazy danych. Dietrich użytkownika nie może już tworzyć tabeli. Dobry. ALE : Teraz także właściciel bazy danych, projekt2 , nie może tworzyć tabeli. Nawet po wydaniu GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
i pojawiaGRANT ALL PRIVILEGES ON SCHEMA public TO project2
się błąd BŁĄD: nie wybrano żadnego schematu do utworzenia , a gdy próbuję CREATE TABLE public.WHATEVER ();
, otrzymuję BŁĄD: odmowa dostępu do schematu publicznie . Co ja robię źle?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. dlaczego to nie miało żadnego efektu?