Blog JSystems - uwalniamy wiedzę!

Szukaj
Z tego artykułu dowiesz się:
  • czym są role grupowe i do czego służą,
  • jak sprawdzać kto jest przypisany do jakiej roli grupowej,
  • jak dodawać użytkownika do roli grupowej,
  • jak usuwać użytkownika z roli grupowej,
  • jak zbiorowo nadawać i odbierać uprawnienia wielu użytkownikom za pomocą ról grupowych,
  • jak kasować role grupowe.

Tworzenie ról grupowych, przydzielanie uprawnień i nadawanie ról grupowych użytkownikom

Role grupowe służą do zbiorowego nadawania i odbierania uprawnień. Jeśli masz grupę użytkowników, którzy powinni mieć podobne uprawnienia, zamiast nadawać im uprawnienia pojedynczo możesz stworzyć rolę grupową i poprzez nią zarządzać ich uprawnieniami. Przejdźmy przez prosty przykład. - Załóżmy, że mamy tabelę i kilku użytkowników, którzy powinni mieć identyczne uprawnienia do tej tabeli. Tworzymy tabelę "role_grupowe" do testowania uprawnień. Tworzymy rolę grupową "programiści". Zwróćmy uwagę, że - rolę grupową stworzyliśmy, korzystając z "create role" a nie "create user"! Rola ta ma nie mieć możliwości logowania, służyć będzie tylko do zarządzania uprawnieniami. Dalej tworzymy dwóch użytkowników - "programista1" i "programista2". Tym razem posługujemy się jednak "create user", ponieważ mają to być role z możliwością logowania (użytkownicy). Nadajemy rolę "programiści" obu użytkownikom. Do roli przypisujemy uprawnienia pozwalające na odczyt i zmianę zawartości tabeli i nadajemy uprawnienie usage na schemacie, w którym znajduje się tabela (public):

create table role_grupowe(x integer);

create role programisci;

create user programista1;

create user programista2;

grant programisci to programista1, programista2;

grant select,update,insert, delete on role_grupowe to programisci;

grant usage on schema public to programisci;

Logujemy się teraz jako - nowo stworzeni - użytkownicy i sprawdzamy uprawnienia:

Nie potrzebujemy tworzyć haseł dla użytkowników ani ich podawać przy logowaniu, bo domyślnie logowanie lokalne w pliku pg_hba.conf jest ustawione na “trust”.



Nadawanie uprawnień poprzez role działa od razu. Nie jest wymagane ponowne nawiązanie sesji przez użytkownika. Sprawdźmy to w praktyce. Tworzymy kolejnego użytkownika:

create user programista3;

Logujemy się na niego do bazy i sprawdzamy, - czy mamy dostęp do tabeli "role_grupowe":

Oczywiście nie mamy do niej uprawnień, więc nadajemy rolę “programisci” temu użytkownikowi z sesji użytkownika postgres:

grant programisci to programista3;

Nie przelogowujemy sesji użytkownika programista3, tylko ponownie sprawdzamy dostęp:

Tym razem udało się, uprawnienie zadziałało natychmiast, bez potrzeby przelogowania.

Możesz też stworzyć użytkownika i za jednym zamachem nadać mu rolę:


create user programista2 with password 'szpyrki!' in role programisci;

Odbieranie ról grupowych użytkownikom

Role grupowe odbieramy w ten sposób:

revoke programisci from programista3;

gdzie "programiści" jest nazwą roli grupowej, a "programista3" nazwą użytkownika. Odbieranie ról, i co za tym idzie wynikających z nich uprawnień, odbywa się natychmiast, podobnie jak ich nadawanie.

Po odebraniu roli programisci, a co za tym idzie również uprawnień z niej wynikających (tutaj dostęp do tabeli “role_grupowe”), użytkownik natychmiast traci uprawnienia, mimo że cały czas trwa jego sesja:

Sprawdzanie przydzielonych ról grupowych

Nie ma - gotowego słownika z listą ról grupowych nadanych użytkownikom, więc aby uzyskać listing wszystkich grup, musimy zrobić mały zabieg w SQL:

select roleid,member,g.rolname grupa,u.rolname uzytkownik

from pg_auth_members m join pg_roles g on m.roleid=g.oid

join pg_roles u on m.member=u.oid;

W wyniku widzimy, że rola “programisci” jest przydzielona użytkownikom “programista1” i “programista2”

Usuwanie ról grupowych

Usuwanie ról grupowych mogłoby się sprowadzać do wykonania:

drop role programisci;

gdyby nie to, że nie ;) Taka próba skończyła się w ten sposób:

Błąd wynika z tego, że rola ta ma nadane wcześniej uprawnienia - odczyt i modyfikację tabeli "role_grupowe", oraz uprawnienie “USAGE” na schemacie “pubic”. - Abyśmy mogli usunąć rolę grupową, trzeba będzie najpierw sprawdzić, jakie uprawnienia zostały do tej roli nadane i je odebrać. Zaczniemy od uprawnień do tabeli “role_grupowe”. Sprawdźmy więc uprawnienia:

select * from information_schema.role_table_grants where grantee='programisci';

Jak widać, rola ta ma przypisane uprawnienia do INSERT, SELECT, UPDATE i DELETE w tabeli "role_grupowe". Możemy je teraz odebrać:

revoke select,insert,delete,update on role_grupowe from programisci;

Nadal nie możemy jeszcze skasować roli:

drop role programisci;

Wynika to z uprawnień do schematu “public” nadanych tej roli:

Sprawdźmy więc, jakie uprawnienia ma rola “programisci” do poszczególnych schematów (zwróćmy uwagę na wskazanie roli ‘programisci’ w wywołaniu funkcji has_schema_privilege):

WITH "names"("name") AS (

  SELECT n.nspname AS "name"

	FROM pg_catalog.pg_namespace n

  	WHERE n.nspname !~ '^pg_'

    	AND n.nspname <> 'information_schema'

) SELECT "name",

  pg_catalog.has_schema_privilege('programisci', "name", 'CREATE') AS "create",

  pg_catalog.has_schema_privilege('programisci', "name", 'USAGE') - AS "usage",

  "name" = pg_catalog.current_schema() AS "current"

	FROM "names";

W wyniku widzimy, - że rola “programisci” ma uprawnienie “USAGE” na schemacie public:

Odbieramy więc to uprawnienie z roli “programisci”:

revoke usage on schema public from programisci;

Teraz możemy spróbować ponownie skasować rolę:

drop role programisci;

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...