V PostgreSQL je vše postaveno na konceptu role .
Při první instalaci PostgreSQL na macOS skript vytvořil roli s vaším uživatelským jménem macOS , se seznamem udělených oprávnění.
V PostgreSQL nejsou žádní uživatelé, pouze role .
Spuštěním psql postgres
ve svém terminálu se automaticky přihlásíte svým uživatelským jménem macOS do PostgreSQL, čímž získáte přístup k vytvořené roli.
V mém případě flaviocopes
role byla vytvořena a mohu ji zobrazit pomocí \du
příkaz:
Vidět? Mám následující atributy rolí ve výchozím nastavení:
Superuser
Create role
Create DB
Replication
Bypass RLS
a nejsem členem žádné jiné role (více o tom později)
Vytvoření nové role
Nová role se vytvoří pomocí CREATE ROLE
příkaz:
CREATE ROLE <role>;
Například:
CREATE ROLE testing;
Máme novou roli s Cannot login
atribut role. Náš nově vytvořený uživatel se nebude moci přihlásit.
Můžete to zkusit zadáním \q
a poté psql postgres -U testing
, ale zobrazí se tato chyba:
K vyřešení tohoto problému musíme přidat LOGIN
atribut role při vytváření:
CREATE ROLE <role> WITH LOGIN;
Pokud tuto roli odebereme pomocí:
DROP ROLE <role>;
a přidejte WITH LOGIN
tentokrát:
DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;
Vidíme, že testing
role se může přihlásit, protože nemáme Cannot login
atribut role tentokrát:
Zkuste to přidáním příkazu \q
pro ukončení a poté psql postgres -U testing
:
Všimněte si, že výzva změněno z =#
na =>
protože nemáme Superuser
atribut role now.
Přidání hesla k roli
V předchozím CREATE ROLE
příkaz vytvořili jsme roli bez hesla. Samozřejmě je velmi důležité mít (zabezpečená) hesla. Heslo můžete přidat pomocí PASSWORD
klíčové slovo:
CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';
VYTVOŘIT UŽIVATELE
Alternativní způsob, jak definovat role pomocí LOGIN
atribut automaticky přidaný (účinně vytváří uživatele, kteří se mohou přihlásit) je použít CREATE USER
:
CREATE USER <role> PASSWORD '<password>';
Přidání atributu role k roli
Atribut role lze k roli přidat později pomocí ALTER ROLE
příkaz.
Předpokládejme, že jsme vytvořili roli bez atributu LOGIN:
CREATE ROLE <username> PASSWORD '<password>';
Můžeme jej přidat pomocí:
ALTER ROLE <role> WITH LOGIN;
Vestavěné atributy rolí
Viděli jsme LOGIN
role, aby se role mohla přihlásit.
Jaké jsou ale další vestavěné atributy rolí, které můžeme použít?
LOGIN
/NOLOGIN
:povolit (nebo ne) přihlásit se k PostgreSQLSUPERUSER
/NOSUPERUSER
:povolit (nebo nepovolit) oprávnění superuživatele. Superuživatel databáze obejde ostatní kontroly oprávnění, kroměLOGIN
(musí být uděleno samostatně).CREATEDB
/NOCREATEDB
:povolit (nebo ne) možnost vytvářet nové databázeCREATEROLE
/NOCREATEROLE
:umožňuje (nebo ne) možnost vytvářet nové roleCREATEUSER
/NOCREATEUSER
:povolit (nebo nepovolit) možnost vytvářet nové uživateleINHERIT
/NOINHERIT
:povolit (nebo nepovolit) možnost dědit oprávněníREPLICATION
/NOREPLICATION
:udělit (nebo neudělit) oprávnění k replikaci (pokročilé téma, kterému se nebudeme věnovat)
Skupinové role
V PostgreSQL nejsou žádné skupiny uživatelů.
Místo toho můžete vytvořit role s určitými oprávněními a pak tyto role udělit jiným rolím.
Role zdědí oprávnění rolí, která jim byla udělena, pokud mají tyto role atribut ZDĚDĚT.
Vytvořte skupinovou roli
Chcete-li vytvořit skupinovou roli, zadejte
CREATE ROLE <groupname>;
Syntaxe je stejná jako při vytváření role.
Jakmile je skupinová role vytvořena, můžete do skupinové role přidat role pomocí GRANT
:
GRANT <groupname> TO <role>
Můžeme například vytvořit flavio
uživatelská role, skupinová role „zaměstnanec“ a přiřazení uživatele ke skupinové roli:
CREATE USER flavio PASSWORD 'superSecret123$';
CREATE ROLE employee;
GRANT employee TO flavio;
Roli můžete odebrat ze skupinové role pomocí:
REVOKE <groupname> FROM <username>
Příklad:
REVOKE employee FROM flavio;
Atributy role skupiny
Ve výchozím nastavení ne přidání role do skupinové role aby role dědila atributy (oprávnění) ze skupinové role.
Skupinovou roli musíte vytvořit pomocí INHERIT
atribut.
Předpokládejme, že vytvoříte roli skupiny zaměstnanců a přiřadíte jí CREATEDB
atribut:
CREATE ROLE employee WITH CREATEDB INHERIT;
Nyní vytvořte novou roli pomocí INHERIT
:
CREATE ROLE flavio;
GRANT employee TO flavio;