Un ruolo in PostgreSQL può rappresentare sia un singolo utente che un gruppo di utenti. Gestisce l’accesso ai database, alle tabelle, agli schemi e ad altri oggetti.
Quando crei un ruolo, di default non è legato a un utente o gruppo specifico, ma puoi assegnargli proprietà e permessi che ti servono per i tuoi scopi.
Differenza tra ruoli e utenti
E gli utenti? Occhio a non confondersi. In PostgreSQL anche gli utenti sono considerati ruoli, ma con una particolarità: gli utenti hanno sempre la possibilità di fare login. Quindi ogni ruolo può essere un utente, se ha l’attributo LOGIN. Se vuoi solo raggruppare utenti o non vuoi che il ruolo possa fare login, puoi non aggiungere l’attributo LOGIN.
Esempio:
- Ruolo con attributo
LOGIN= utente. - Ruolo senza
LOGIN= gruppo o “ruolo di servizio”.
Creiamo un ruolo
Per creare ruoli si usa il comando CREATE ROLE. La sintassi è questa:
CREATE ROLE <nome_ruolo> [WITH] [parametri];
Dove parametri sono le proprietà del ruolo, tipo:
LOGIN— possibilità di accedere al database.CREATEDB— possibilità di creare database.CREATEROLE— possibilità di creare altri ruoli.SUPERUSER— accesso totale (ruoli pericolosi, usali con attenzione).PASSWORD— password per l’autenticazione.
Vediamo un esempio di creazione di un ruolo utente. Supponiamo che vuoi creare l’utente student con diritto di login e password. Esegui questa query:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
Questo comando crea un ruolo chiamato student che può collegarsi al database.
Ora creiamo il ruolo teachers, che sarà un gruppo. Un ruolo di gruppo non ha bisogno dell’attributo LOGIN, perché gli utenti che fanno parte del gruppo useranno i loro account.
CREATE ROLE teachers;
Assegnare privilegi ai ruoli
I ruoli in PostgreSQL vengono creati per dare o limitare l’accesso alle risorse. Per questo si usano i comandi GRANT e REVOKE.
Concedere permessi con GRANT
Sintassi del comando:
GRANT <privilegi> ON <oggetto> TO <ruolo>;
Creiamo una tabella courses e diamo al ruolo teachers i permessi di leggere e modificare i dati in questa tabella.
-- Creiamo la tabella
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- Concediamo l’accesso
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
Ora tutti gli utenti che fanno parte del ruolo teachers possono vedere, aggiungere e modificare i dati nella tabella.
Revocare permessi con REVOKE
Per togliere i permessi si usa il comando REVOKE. Sintassi:
REVOKE <privilegi> ON <oggetto> FROM <ruolo>;
Per vietare al gruppo teachers di aggiornare i dati nella tabella courses, esegui:
REVOKE UPDATE ON courses FROM teachers;
Gerarchia dei ruoli: ereditarietà
Gli utenti possono “ereditare” i privilegi da un ruolo-gruppo per semplificare la gestione. È come passare “l’eredità” da un utente all’altro.
La parola chiave INHERIT permette a un ruolo di ereditare i privilegi da un altro ruolo. Questo comportamento è attivo di default, ma puoi cambiarlo.
Esempio:
-- Aggiungiamo l’utente `john` al gruppo `teachers`
GRANT teachers TO john;
Ora l’utente john riceve automaticamente tutti i privilegi assegnati al ruolo di gruppo teachers.
Controlliamo i privilegi:
\du john
Se vuoi disattivare l’ereditarietà, crea il ruolo con l’attributo NOINHERIT.
CREATE ROLE admin NOINHERIT;
Ora gli utenti nel ruolo admin non potranno usare di default i suoi privilegi.
Creare gruppi di ruoli per gestire l’accesso
I gruppi di ruoli rendono più facile gestire l’accesso, soprattutto in progetti grandi. Invece di dare permessi a ogni utente, puoi aggiungere gli utenti ai gruppi e dare i permessi ai gruppi.
Ecco un esempio semplice di ruolo di gruppo. Creiamo i gruppi:
students— gruppo per gli studenti.teachers— gruppo per i docenti.
CREATE ROLE students;
CREATE ROLE teachers;
Assegniamo gli utenti ai gruppi:
-- Assegna l’utente john al gruppo students
GRANT students TO john;
-- Assegna l’utente jane al gruppo teachers
GRANT teachers TO jane;
Ora, dando accesso alle tabelle ai gruppi students e teachers, lo dai automaticamente a tutti i loro membri!
Esercizio pratico
- Crea una tabella
examscon i campi:id: chiave primaria;subject: testo;teacher_id: ID del docente.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- Crea i gruppi di ruoli
studentseteachers.
CREATE ROLE students;
CREATE ROLE teachers;
- Dai al gruppo
teachersi permessi di aggiungere e modificare dati nella tabellaexams.
GRANT INSERT, UPDATE ON exams TO teachers;
- Dai al gruppo
studentssolo il permesso di leggere i dati.
GRANT SELECT ON exams TO students;
- Crea l’utente
alicee aggiungila al gruppostudents.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- Controlla quali permessi ha
alicecollegandoti con il suo account.
Ora sai come creare ruoli, gestire i loro privilegi e semplificare l’amministrazione usando i ruoli di gruppo. Nella prossima lezione vedremo come configurare l’accesso con i comandi GRANT e REVOKE per un controllo più preciso a livello di database, schema e tabelle.
GO TO FULL VERSION