CREATE ROLE / CREATE USER în PostgreSQL

Utilizatori și permisiuni PostgreSQL 8.1+ (SCRAM-SHA-256 implicit: 14+)

Creează un rol: un utilizator care se poate conecta (LOGIN) sau un grup de drepturi atribuit altor roluri.

Sintaxă SQL
CREATE ROLE nume [WITH] [LOGIN | NOLOGIN] [PASSWORD 'parola'] [CREATEDB] [CREATEROLE]
    [CONNECTION LIMIT n] [VALID UNTIL 'data'] [IN ROLE grup];
CREATE USER nume ...   -- la fel, cu LOGIN implicit
ALTER ROLE nume ...;   GRANT grup TO nume;

Ce face CREATE ROLE / CREATE USER

În PostgreSQL, utilizatorii și grupurile sunt același lucru: roluri. Un rol cu LOGIN este un utilizator care se poate conecta. Un rol NOLOGIN este de obicei un grup: îi dai drepturi, apoi îl atribui utilizatorilor cu GRANT grup TO utilizator.

CREATE USER este identic cu CREATE ROLE ... LOGIN. Rolurile sunt la nivel de server, comune tuturor bazelor de date; drepturile pe tabele se dau separat, în fiecare bază de date.

Din PostgreSQL 14, parolele se salvează implicit cu SCRAM-SHA-256. În psql, \password nume schimbă parola fără ca textul ei să ajungă în istoricul comenzilor sau în jurnalele serverului.

Parametri

Parametru Descriere
LOGIN / NOLOGIN Poate sau nu să se conecteze.
PASSWORD Parola de conectare.
CREATEDB / CREATEROLE / SUPERUSER Drepturi speciale; dă-le cu grijă (SUPERUSER ocolește toate verificările).
CONNECTION LIMIT n Numărul maxim de conexiuni simultane.
VALID UNTIL Data până la care parola este valabilă.
IN ROLE grup Adaugă rolul nou ca membru al grupului.

Ce returnează

Mesajul CREATE ROLE (și pentru CREATE USER).

Exemple

Exemplul 1: Un grup de citire și doi utilizatori

CREATE ROLE cititori NOLOGIN;
CREATE ROLE ana LOGIN PASSWORD 'o-parola-lunga-si-unica' IN ROLE cititori;
CREATE USER aplicatie_web PASSWORD 'alta-parola-lunga' CONNECTION LIMIT 50;

Rezultat în psql

CREATE ROLE
CREATE ROLE
CREATE ROLE

Exemplul 2: Cont temporar pentru un colaborator

CREATE ROLE consultant LOGIN VALID UNTIL '2027-01-31';
\password consultant
GRANT cititori TO consultant;

Rezultat în psql

CREATE ROLE
Enter new password for user "consultant": 
Enter it again: 
GRANT ROLE

Exemplul 3: Ce roluri există

SELECT rolname, rolcanlogin, rolsuper
FROM pg_roles
WHERE rolname NOT LIKE 'pg\_%'
ORDER BY rolname;

Rezultat în psql

    rolname    | rolcanlogin | rolsuper 
---------------+-------------+----------
 ana           | t           | f
 aplicatie_web | t           | f
 cititori      | f           | f
 consultant    | t           | f
 postgres      | t           | t
(5 rows)

Greșeli frecvente

  • Aplicația se conectează cu utilizatorul postgres (superuser). O vulnerabilitate în aplicație dă atunci acces total la server. Creează un rol separat, cu drepturi minime.
  • Scrii parola în clar în CREATE ROLE pe un server cu log_statement = 'all': parola ajunge în jurnal. Folosește \password.
  • Creezi rolul și te aștepți să poată citi tabelele: un rol nou nu are niciun drept pe tabele. Folosește GRANT.

Comenzi înrudite

  • GRANT și ALTER DEFAULT PRIVILEGES: Dă unui rol drepturi pe o bază de date, o schemă, tabele sau secvențe. ALTER DEFAULT PRIVILEGES le dă automat și pe tabelele create ulterior.
  • REVOKE: Retrage drepturi date anterior cu GRANT, de la un rol sau de la toți (PUBLIC).
  • CREATE DATABASE / DROP DATABASE: Creează sau șterge o bază de date pe serverul PostgreSQL. O bază de date conține scheme, tabele și utilizatorii ei au drepturi separate.