Základní koncept v Postgres
Role jsou globální objekty, které mohou přistupovat ke všem databázím v db clusteru – mají-li požadovaná oprávnění.
shluk obsahuje mnoho databází , které obsahují mnoho schémat . Schémata (i se stejným názvem) v různých DB spolu nesouvisí. Udělení oprávnění pro schéma se vztahuje pouze na toto konkrétní schéma v aktuální DB (aktuální DB v době udělení).
Každá databáze začíná schématem public
ve výchozím stavu. To je konvence a mnoho nastavení tím začíná. Kromě toho schéma public
je jen schéma jako každé jiné.
Pocházíme z MySQL a možná budete chtít začít s jediným schématem public
, efektivně zcela ignoruje vrstvu schématu. Pravidelně používám desítky schémat na databázi.
Schéma jsou trochu (ale ne úplně) jako adresáře v systému souborů.
Jakmile použijete více schémat, ujistěte se, že rozumíte search_path
nastavení:
- Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
Výchozí oprávnění
Podle dokumentace na GRANT
:
PostgreSQL uděluje výchozí oprávnění k některým typům objektů
PUBLIC
.PUBLIC
nejsou udělena žádná oprávnění ve výchozím nastavení na tabulky, sloupce, schémata nebo tabulkové prostory. U ostatních typů jsou výchozí privilegia udělenaPUBLIC
jsou následující:CONNECT
aCREATE TEMP TABLE
pro databáze;EXECUTE
oprávnění k funkcím; aUSAGE
privilegium pro jazyky.
Všechny tyto výchozí hodnoty lze změnit pomocí ALTER DEFAULT PRIVILEGES
:
- Udělte vše na konkrétním schématu v databázi skupinové roli v PostgreSQL
Skupinová role
Jak poznamenal @Craig, nejlepší je GRANT
oprávnění ke skupinové roli a poté učinit konkrétního uživatele členem této role (GRANT
skupinová role na uživatelskou roli). Tímto způsobem je jednodušší rozdělit a zrušit svazky oprávnění potřebných pro určité úkoly.
Skupinová role je jen další role bez přihlášení. Přidejte přihlašovací jméno a převeďte jej na uživatelskou roli. Více:
- Proč PostgreSQL sloučil uživatele a skupiny do rolí?
Předdefinované role
Aktualizace: Postgres 14 nebo novější přidává nové předdefinované role (formálně „výchozí role“) pg_read_all_data
a pg_write_all_data
pro zjednodušení některých níže uvedených. Viz:
- Udělte přístup ke všem tabulkám databáze
Recept
Řekněme, že máme novou databázi mydb
, skupina mygrp
a uživatel myusr
...
Při připojení k dané databázi jako superuživatel (postgres
například):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Chcete-li přiřadit „uživateli všechna oprávnění ke všem tabulkám“ jak jsi napsal (možná bych byl restriktivnější):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Chcete-li nastavit výchozí oprávnění pro budoucí objekty, spusťte pro každou roli který vytváří objekty v tomto schématu:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Nyní udělte skupinu uživateli:
GRANT mygrp TO myusr;
Související odpověď:
- PostgreSQL – uživatel DB by měl mít povoleno pouze volat funkce
Alternativní (nestandardní) nastavení
Pochází z MySQL a protože chcete ponechat oprávnění k databázím oddělená, mohlo by se vám líbit toto nestandardní nastavení db_user_namespace
. Podle dokumentace:
Tento parametr povoluje uživatelská jména pro jednotlivé databáze. Ve výchozím nastavení je vypnuto.
Přečtěte si pozorně návod. Toto nastavení nepoužívám. Výše uvedené neruší.