Vytvoření a správa skupin
Vytváření skupin uživatelů může předcházet vytvoření jednotlivých uživatelů, proto jej předřazuji samotnému vytvoření uživatelů. Práva k jednotlivým databázím a tabulkám totiž lze přiřazovat jednotlivým skupinám, i uživatelům, ale je mnohem přehlednější vytvořit skupinu, která má garantované určité přístupy, do níž se pak přidávají nově vytvoření uživatelé, než vytvářet uživatele mimo skupiny a těm pak jednotlivě přiřazovat potřebná práva. Je rozdíl mezi verzemi před 8.0, včetně, a v tom, jaké jsou změny od řady 8.1. To jak je systém přepracován od verze 8.1 naleznete v odstavcích dále a tuto část textu můžete přeskočit.
Nová skupina uživatelů se vytváří pomocí příkazu CREATE GROUP jmeno_skupiny [[WITH] volba [dalsi_volba]]
, kde volby a parametry jsou následující (ve verzi 7.4 nejsou tyto volby obsaženy):
-- ve verzi 8.0
SYSID gid
USER uzivatelske_jmeno [, dalsi_uzivatel [, ...]]
Jedinými parametry jsou číslo skupiny (gid), které pokud nezadáte bude vygenerováno automaticky a členové skupiny, které však můžete přidávat později pomocí ALTER GROUP
.
Například při tvorbě účetního systému pro přístup ke klíčovým datům, při rozdělení na různých činností, které je běžné ve velkých firmách, budete mít skupiny správců, perzonalistů a účetních (i ty lze rozdělit na mzdové a finanční), do kterých pak budete přiřazovat jednotlivé uživatele, kteří pak budou mít přístup definovaný pouze k určitým databázím, tabulkám, či pohledům.
Změny ve skupinách se realizují pomocí příkazu ALTER USER
ve třech možných variantách.
-- pridani jednoho nebo vice uzivatelu do skupiny jmeno
ALTER GROUP jmeno ADD USER uzivatel1 [, ...]
-- odebrani jednoho nebo vice uzivatelu ze skupiny jmeno
ALTER GROUP jmeno DROP USER uzivatel1 [, ...]
-- prejmenovani skupiny, toto smi udelat pouze vlastnik db
ALTER GROUP jmeno RENAME TO nove_jmeno
Pro smazání skupiny je, nejjednodušší a nejkratší, příkaz DROP GROUP jmeno
.
Od verze 8.1 jsou skupiny v tomto pojetí zrušeny, nejedná se o SQL standard, a je povoleno vytvářet pouze uživatele/role.
Vytváření a správa uživatelů
Stále platí, že pro vytvoření prvního uživatele musíte být přihlášeni jako hlavní uživatel postgres, a to ať z konzole/terminálu, nebo v rámci SQL příkazu, ale už zmizela jedna menší nelogičnost v právech vytváření uživatelů. Protože se snažím v seriálu postihnout vlastnosti řady 7 i aktuální 8, pokusíme se v tomto díle vysvětlit obě verze.
Z terminálu vytvoříte uživatele, pochopitelně, máte-li k tomu patřičná práva, příkazem createuser
, jehož přesné parametry naleznete buď vyvoláním nápovědy pomocí createuser --help
, případně s přesným popisem pomocí man createuser
, eventuálně v dokumentaci na stránkách PostgreSQL serveru, samozřejmě, že musíte otevřít dokumentaci k té verzi PgSQL, kterou používáte. Alespoň bodově si popíšeme změny:
- Byly odstraněny parametry -a; --adduser a -A; --no-adduser, které ve verzích 8.0 a starších sloužily k vytvoření uživatele s právy vytvářet uživatele, ale nebylo už diferencováno, zda-li má takto vytvářený uživatel právo vytvořit jen běžného uživatele, nebo superuživatele. Nově je tento parametr nahrazen následujícími:
- -s; --superuser — Nově vytvořený uživatel bude superuživatelem. Takovéhoto uživatele může vytvořit jen jiný superuživatel. Z mnoha důvodů není příliž šťastné vytvářet více uživatelů s takovýmity právy.
- -S; --no-superuser — Inverzní parametr k předchozímu. Tento parametr je nastaven jako výchozí.
- -r; --createrole — Nově vytvořený uživatel bude mít oprávnění vytvářet další uživateke, ale pouze s běžnými právy, nebude moci vytvořit superuživatele.
- -R; --no-createrole — Inverzní parametr proti předchozímu, je defaultní.
- Parametr -i změnil význam, zatímco ve verzích 8.0 a předchozích sloužil, případně v dlouhé verzi --sysid k určení uid, což někteří správci využívali k tomu, aby měli stejné id uživatele v PgSQL i Un*xovém operačním systému, dnes je tento parametr v zrušen v původním významu. Nově parametr -i, eventuálně v dlouhé verzi -inherit, slouží k určení role, od které má nový uživatel dědit vlastnosti. Inverzním parametrem je logicky -I, či --no-inherit. Pokud spravujete systém, kde je zapotřebí mít mnoho uživatelů se stejnými právy, je použítí dědění dobrým způsobem, jak si ušetřit mnoho práce.
Ostatní parametry zůstaly beze změny. Pokud nezadáte některý z podstatných parametrů, jako například má-li být superuživatelem, právo vytvářet databáze a další běžné uživatele, utilita createuser
se interaktivně vyptá na zbylé parametry.
Konzolový příkaz createuser
má svůj ekvivalent i v SQL příkazu, protože může být velmi užitečné moci vytvořit dalšího uživatele z aplikace, což by použitím konzolové utility nemuselo být vůbec snadné. Tento příkaz je CREATE USER jmeno_uzivatele [WITH volba [dalsi_volba]]
. Naprostým ekvivalentem a používaným se stejnými parametry je příkaz CREATE ROLE jmeno_uzivatele [WITH volba [dalsi_volba]]
. Parametry příkazu jsou víceméně samodokumentační, čiže by měl většině uživatelů postačit jejich prostý výpis, eventuálně lze nahládnout do dokumentace na stránkách PostgreSQL, v tomto díle popíšu jen ty volby, kde by mohli být nejasnosti.
Ve verzích 8.0 a starších byly parametry:
SYSID uid
CREATEDB | NOCREATEDB
CREATEUSER | NOCREATEUSER
IN GROUP groupname [, ...]
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
VALID UNTIL 'abstime'
A od verze 8.1 jsou platné parametry:
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
CONNECTION LIMIT limit_spojeni
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'heslo'
VALID UNTIL 'casovy_udaj'
IN ROLE role [, ...]
IN GROUP role [, ...]
ROLE role [, ...]
ADMIN role [, ...]
USER role [, ...]
SYSID uid
Opět není třeba zadávat všechny parametry, leč nebudete na vlastnosti nového uživatele interaktivně dotázáni, ale budou použity defaultní volby, které jsou defaultní stejně jako v případě konzolové varianty. Jak vidíte z výpisu možných parametrů, které jsou použitelné v SQL příkazu, tak možnosti jsou poněkudsi širší. Některé parametry si popíšeme v krátkém seznamu.
- CONNECTION LIMIT – Udává limit souběžných připojení uživatele/role. Výchozí hodnota je −1, která povoluje neomezený počet současných připojení.
- SYSID – Nově vytvořenému uživateli přiřadíte identifikátor, můžete stejný, jako je jeho uid v systému, nezadáte-li bude vygenerováno automaticky. Tento parametr poslouží zejména těm administrátorů, kteří chtějí mít v systému i databázi stejným způsobem číslované uživatele.
- VALID UNTIL – Po vypršení časového omezení se nebude moci uživatel přihlásit.
- LOGIN | NO LOGIN – Pro někoho poněkudsi nelogická volba NOLOGIN, díky které nebude možné se přihlásit pod tímto účtem, ale poslouží pro nastavení práv k jednotlivým databázím. Pokud použijete příkaz
CREATE USER
bude přihlášení povolené i bez uvedení klauzule LOGIN
, ve všech ostatních případech bude výchozí volbou NOLOGIN
.
- IN ROLE – Pokud zadáte tuto klauzili a za ní vypíšete jména existujících rolí, bude tato nově vytvářená role přiřazená do vyjmenovaných. Jedná se o systém správy skupin, jak je pojat od PostgreSQL 8.1.
- IN GROUP – Alias pro
IN ROLE
. Je označen jako zastaralý, takže nemusí časem být podporován.
- ROLE – Obrácená klauzule vůči
IN ROLE
, čiže při vytváření nové role vyjmenujete již existující, které do této budou zahrnuty. Stručněji, tímto vytvoříte skupinu a do ní zahrnete ať již existující skupiny, nebo existující uživatele.
- USER – Alias pro
ROLE
. Je označen jako zastaralý, takže nemusí časem být podporován.
- ADMIN – Chová se podobně, jako
ROLE
, ale uživatelé, které jste tímto zahrnuli budou mít administrátorská práva v této skupině.
Již z popisu přepínačů je vidět, že role zcela nahrazují původní model uživatelů a skupin uživatelů. Pro někoho může být pochopitelnější a průhlednější původní systém, ale do Postgresu se dostávají takto veliké změny po velmi zralé úvaze, čiže se bude jednat opravdu o značně lepší systém ve správě uživatelů, především je vidět jeho lepší variabilita. Podstatné je, že od verze 8.1 je zapotřebí přestat uvažovat o uživatelích a skupinách, ale uvažovat o rolích, které jsou i ANSI SQL standardem.
Změna nastavení uživatelů se provádí příkazem ALTER USER jmeno [[WITH] volba [, dalsi_volba]]
, od verze 8.1, v terminologii rolí, se využívá funkce ALTER ROLE jmeno [[WITH] volba [, dalsi volba]]
Volby jsou téměř stejné jako při vytváření nového uživatele, jen jich několik chybí:
Do verze 8.0, včetně, jsou parametry:
CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'abstime'
Od verze 8.1 platí následující parametry:
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
CONNECTION LIMIT limit_spojeni
[ENCRYPTED | UNECRYPTED] PASSWORD 'heslo'
VALID_UNTIL 'casovy_udaj'
Přiřazení práv
V předchozích odstavcích jste se seznámili s vytvářením jednotlivých uřivatelů a skupin v PostgreSQL, nyní je zapotřebí vytvořeným rolím přiřadit práva na objekty v databázi. K delegování práv slouží příkaz GRANT
, s patřičnými parametry. Pokud na PostgreSQL přecházíte z MySQL, tento příkaz pravděpodobně znáte. Výpis všech parametrů příkazu naleznete
v dokumentaci na stránkách
PostgreSQL, nebudu jej zde uvádět z prostorových důvodů, spíše bude vhodnější si vše ukázat na příkladech, které se budou z
pochopitelných důvodů vztahovat k verzi 8.1 a novějším.
GRANT
poslouží k delegování práv k databázovým objektům pro jednotlivé role, ale pokud chceme tato práva odebrat, alespoň některá z nich, je třeba použít příkazu REVOKE
, který je opět popsán v původní dokumentaci na stránkách PostgreSQL, parametrů má poměrně mnoho.
Příklad
-- hlavni role, ktera mi zastresuje cele mzdy
CREATE ROLE amzdy NOLOGIN ENCRYPTED PASSWORD '123mzdy';
-- podrizene role
CREATE ROLE pam NOLOGIN ENCRYPTED PASSWORD 'derf' IN ROLE amzdy;
CREATE ROLE admin NOLOGIN ENCRYPTED PASSWORD 'fred' IN ROLE amzdy;
-- Nyni uzivatele
CREATE ROLE marek2 LOGIN ENCRYPTED PASSWORD 'm123' IN ROLE pam, admin;
-- sebe davam jako (hlavniho) spravce do vsech roli
CREATE ROLE jarsuk LOGIN ENCRYPTED PASSWORD 'jaro123';
-- zapomenuta role i s uzivateli
CREATE ROLE mzdy NOLOGIN ENCRYPTED PASSWORD 'vyplaty' IN ROLE amzdy ROLE
jarsuk, marek2;
-- sobe pridelim veskera prava
GRANT ALL ON DATABASE amzdy TO marek2 WITH GRANT OPTION;
-- k mzdovym tabulkam (casti) pridam prava pro role mzdy a amzdy
GRANT SELECT, INSERT, UPDATE, DELETE ON prac, nemd, mzdp, ucty TO amzdy, mzdy;
-- uzivateli jarsuk odeberu prava mazani a prepisu
REVOKE DELETE, UPDATE ON prac, nemd, mzdp, ucty FROM jarsuk;
Závěr
V tomto díle jsem si dovolil udělat menší odbočku, která vznikla díky změně z PostgreSQL 7.2 na 8.1 na jednom serveru, o který se starám. Zpočátku se mi změna systému, od jednoduché terminologie skupin a uživatelů k rolím, příliž nelíbila, ale po vytvoření pár desítek rolí, z celkového počtu 120, jsem uznal, že tento systém je mnohem průhlednější a pružnější.
Příště se zase vrátíme k běžné manipulaci s daty a bude již načase otevřít možnosti programování na straně databáze, tj. uděláme krok k vícevrstvým aplikacím.