2012-02-12 14 views
7

Ho 3 ruoli: superutente, poweruser e utente. Ho tabella "dati" e funzioni data_select e data_insert.postgresql 9.1 - tabelle di accesso tramite le funzioni

Ora vorrei definire che solo il superutente può accedere alla tabella "dati". Poweruser e l'utente non possono accedere direttamente ai "dati" della tabella, ma solo attraverso le funzioni.

L'utente può eseguire solo la funzione data_select, poweruser può eseguire sia data_select che data_insert.

Quindi posso creare utenti alice, bob, ... e ereditare i privilegi dell'utente o del server.

È effettivamente possibile? Sto combattendo con questo per il secondo giorno e non arrivare da nessuna parte.

Grazie per il vostro tempo.

risposta

8

Sì, questo è fattibile.

"superutente" potrebbe essere un valore effettivo superuser, postgres per impostazione predefinita. Ho rinominato il ruolo per utenti semplici su usr, perché user è una parola riservata: non utilizzarla come identificatore.

CREATE ROLE usr; 
CREATE ROLE poweruser; 
GRANT usr TO poweruser; -- poweruser can do everything usr can. 

CREATE ROLE bob PASSWORD <password>; 
GRANT poweruser TO bob; 

CREATE ROLE alice PASSWORD <password>; 
GRANT usr TO alice; 

REVOKE ALL ON SCHEMA x FROM public; 
GRANT USAGE ON SCHEMA x TO usr; 

REVOKE ALL ON TABLE x FROM public; 
REVOKE ALL ON TABLE y FROM public; 

CREATE FUNCTION 
    ... 
SECURITY DEFINER; 

REVOKE ALL ON FUNCTION ... FROM public; 
GRANT EXECUTE ON FUNCTION a TO usr; 
GRANT EXECUTE ON FUNCTION b TO poweruser; 

Oppure è possibile creare ruoli demone senza accesso per possedere le funzioni e mantenere i rispettivi diritti sul tavolo. Sarebbe ancora più sicuro.

Se si sta andando questa strada, si sarà amareALTER DEFAULT PRIVILEGES (introdotta con PostgreSQL 9.0). More details in this related answer.

Leggere il capitolo Writing SECURITY DEFINER Functions Safely nel manuale.

Problemi correlati