Rola w PostgreSQL może oznaczać pojedynczego użytkownika albo grupę użytkowników. Zarządza dostępem do baz danych, tabel, schematów i innych obiektów.
Kiedy tworzysz rolę, domyślnie nie jest ona przypisana do konkretnego użytkownika czy grupy, ale możesz nadać jej właściwości i uprawnienia, które pasują do twoich potrzeb.
Różnica między rolami a użytkownikami
A co z użytkownikami? Tu łatwo się pomylić. W PostgreSQL użytkownicy to też role, ale z jedną cechą: użytkownicy zawsze mają możliwość logowania się do systemu. Czyli każda rola może być użytkownikiem, jeśli ma atrybut LOGIN. Jeśli chcesz tylko połączyć użytkowników w grupę albo nie dawać jej możliwości logowania, nie dodawaj atrybutu LOGIN.
Przykład:
- Rola z atrybutem
LOGIN= użytkownik. - Rola bez
LOGIN= grupa albo "rola techniczna".
Tworzymy rolę
Do tworzenia ról używasz komendy CREATE ROLE. Składnia wygląda tak:
CREATE ROLE <nazwa_roli> [WITH] [parametry];
Gdzie parametry — to właściwości roli, takie jak:
LOGIN— możliwość logowania się do bazy danych.CREATEDB— możliwość tworzenia baz danych.CREATEROLE— możliwość tworzenia innych ról.SUPERUSER— pełny dostęp (najbardziej niebezpieczne role, używaj ostrożnie).PASSWORD— hasło do autoryzacji.
Sprawdźmy przykład tworzenia roli użytkownika. Załóżmy, że chcesz stworzyć użytkownika student z prawem logowania i hasłem. Wykonaj taki zapytanie:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
Ta komenda stworzy rolę o nazwie student, która będzie mogła łączyć się z bazą danych.
Teraz stwórzmy rolę teachers, która będzie grupowa. Rola grupowa nie potrzebuje atrybutu LOGIN, bo użytkownicy w grupie używają swoich własnych kont.
CREATE ROLE teachers;
Nadawanie uprawnień rolom
Role w PostgreSQL są po to, żeby dawać lub ograniczać dostęp do zasobów. Do tego służą komendy GRANT i REVOKE.
Nadawanie praw przez GRANT
Składnia komendy:
GRANT <uprawnienia> ON <obiekt> TO <rola>;
Stwórzmy tabelę courses i dajmy roli teachers prawa do czytania i zmiany danych w tej tabeli.
-- Tworzymy tabelę
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- Nadajemy dostęp
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
Teraz wszyscy użytkownicy w roli teachers mogą przeglądać, dodawać i zmieniać dane w tej tabeli.
Odbieranie praw przez REVOKE
Do odbierania praw służy komenda REVOKE. Składnia:
REVOKE <uprawnienia> ON <obiekt> FROM <rola>;
Żeby zabronić grupie teachers aktualizowania danych w tabeli courses, wykonaj komendę:
REVOKE UPDATE ON courses FROM teachers;
Hierarchia ról: dziedziczenie
Użytkownicy mogą "dziedziczyć" uprawnienia od roli-grupy, żeby łatwiej zarządzać dostępem. To jak przekazywanie "spadku" od jednej osoby do drugiej.
Słowo kluczowe INHERIT pozwala roli dziedziczyć uprawnienia od innej roli. To zachowanie jest domyślne, ale można je zmienić.
Przykład:
-- Dodajemy użytkownika `john` do grupy `teachers`
GRANT teachers TO john;
Teraz użytkownik john automatycznie dostaje wszystkie uprawnienia przypisane do roli grupowej teachers.
Sprawdźmy uprawnienia:
\du john
Jeśli chcesz wyłączyć dziedziczenie, rola jest tworzona z atrybutem NOINHERIT.
CREATE ROLE admin NOINHERIT;
Teraz użytkownicy w roli admin nie mogą domyślnie korzystać z jej uprawnień.
Tworzenie grup ról do zarządzania dostępem
Grupy ról ułatwiają zarządzanie dostępem, szczególnie w dużych projektach. Zamiast nadawać prawa każdemu użytkownikowi z osobna, możesz dodać użytkowników do grup, a grupom nadać odpowiednie uprawnienia.
Podajmy prosty przykład roli grupowej. Stwórzmy grupy:
students— grupa dla studentów.teachers— grupa dla nauczycieli.
CREATE ROLE students;
CREATE ROLE teachers;
Przypisz użytkowników do grup:
-- Przypisz użytkownika john do grupy students
GRANT students TO john;
-- Przypisz użytkownika jane do grupy teachers
GRANT teachers TO jane;
Teraz, dając dostęp do tabeli grupom students i teachers, automatycznie dajesz go wszystkim ich członkom!
Ćwiczenie praktyczne
- Stwórz tabelę
examsz polami:id: klucz główny;subject: tekst;teacher_id: ID nauczyciela.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- Stwórz grupy ról
studentsiteachers.
CREATE ROLE students;
CREATE ROLE teachers;
- Daj grupie
teachersprawa do dodawania i zmiany danych w tabeliexams.
GRANT INSERT, UPDATE ON exams TO teachers;
- Daj grupie
studentsprawo tylko do czytania danych.
GRANT SELECT ON exams TO students;
- Stwórz użytkownika
alicei dodaj ją do grupystudents.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- Sprawdź, jakie prawa ma
alice, logując się na jej konto.
Teraz już wiesz, jak tworzyć role, zarządzać ich uprawnieniami i ułatwiać administrowanie przez role grupowe. W następnym wykładzie omówimy, jak ustawiać dostęp za pomocą komend GRANT i REVOKE dla dokładniejszego zarządzania na poziomie baz danych, schematów i tabel.
GO TO FULL VERSION