Il principio di funzionamento è questo:
•il DB di connessione è C00000 per tutti
•lo schema targettato è "public"
•gli oggetti che devono essere resi disponibili sono tabelle, sequenze, funzioni
•I permessi e gli utenti possono essere creati, revocati, impostati o tramite PgAdmin III nella finestra di proprietà dell'oggetto alla voce Privileges (o Default Privileges) o tramite script presenti in "R:\postgresql\sql\areaapp\sql x gestione utenti c00000".
Il database mette a disposizione due tipi di utente che nella terminologia Postgres vengono definiti roles:
1.group roles: sono utenti per i quali solitamente si determinano le operazioni che possono fare sugli oggetti del database, non hanno facoltà di connettersi al database tramite un'interfaccia client
2.login roles: sono gli utenti tramite i quali un certo client si connette al DB, solitamente non hanno espliciti diritti verso gli oggetti del database
L'obbiettivo è quindi quello di avere differenti group roles con gli opportuni permessi verso gli oggetti database, questi group roles grantano ai login roles i diritti per operare sul database. In questo modo posso attivare/disattivare utenti di accesso (login roles) semplicemente assegnadogli o disassegandogli ai group roles.
Lo schema public è grantato di default al ruolo public, ruolo a cui appartengono di default TUTTI gli utenti (roles) creati.
Grantare i diritti di USAGE (uso) ad un utente per lo schema public indica che l'utente può "vedere" gli oggetti presenti nello schema, poi l'utilizzo di tali oggetti è determinato dai privilegi assegnati all'utente.
•creazione dei group roles: sono gli utenti che opereranno sul DB quindi vengono suddivisi per tipologia:
oapp- sono gli utenti che si collegano tramite app o tramite demone PHP per operare sul C00000
olog- sono gli utenti che opereranno sol DB di log ActivityDb
oswa- sono gli utenti usati dai programmi gestionali swa per operare sul C00000
owes- sono gli utenti usati da WEb Service per operare sul C00000
Gli script che creano questi utenti sono denominati:
"create group role ...-group.sql"
esempio di script di creazione:
-- Role: es2000-app-group
-- DROP ROLE "es2000-app-group";
CREATE ROLE "es2000-app-group"
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
COMMENT ON ROLE "es2000-app-group" IS 'utente di app es2000, ruolo operativo su DB';
Come si nota non viene indicata una password perchè non è implementata.
•creazione dei permessi standard sullo schema public: con questo settaggio si fa sì che i nuovi oggetti che verranno creati all'interno dello schema public prendano di default i diritti grantati al group role.
notare che i privilegi sono per tipologia di oggetti: tabelle, sequenze, funzioni, tipi
Questo per esempio è lo script che crea i diritti di default per un group role "es2000-app-group":
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES
TO "es2000-app-group" WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, UPDATE, USAGE ON SEQUENCES
TO "es2000-app-group" WITH GRANT OPTION;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT EXECUTE ON FUNCTIONS
TO "es2000-app-group" WITH GRANT OPTION;
La presenza del parametro WITH GRANT OPTION è importante perchè permetterà al role di grantare a sua volta i diritti concessi.
•concessione dei permessi al group role: con questa operazione si vanno a concedere i per eseguire determinate operazioni SQL sugli oggetti (tabelle, sequenze, funzioni) attualmente presenti nel DB. In questo caso se si usa PgAdmin si deve selezionare la cartella degli oggetti interessati, poi click con il pulsante dx e quindi selezionare la voce su "Grant Wizard..." e da lì parte un interfaccia che permette di selezionare gli oggetti ed assegnargli i diritti opportuni.
Si fa prima usando lo script "grant partial to role ...-group on C00000.sql", di cui sotto c'è un esempio:
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA PUBLIC to GROUP "es2000-app-group" WITH GRANT OPTION;
GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA PUBLIC to GROUP "es2000-app-group" WITH GRANT OPTION;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA PUBLIC to GROUP "es2000-app-group" WITH GRANT OPTION;
Questo è lo step che viene ripetuto per ciascun utente client che deve accedere al DB: con questa procedura si crea un login role che permetterà l'accesso al database e che potrà operare sugli oggetti del DB tramite il group role a cui verrà associato.
Questa procedura è preferibile farla tramite PgAdmin III in questo modo viene creato un hash MD5 per la password, altrimenti esempio di script:
Esempio di creazione di un utente per SWA gestionale SWU_C04351
-- Role: SWU_C04351
-- DROP ROLE "SWU_C04351";
CREATE ROLE "SWU_C04351" LOGIN
ENCRYPTED PASSWORD 'md5c7bf75bb0109d66c5c121497cb6f17ad'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT "es2000-swa-group" TO "SWU_C04351";
COMMENT ON ROLE "SWU_C04351" IS 'Swa User, pwd=2016!swu#c04351!';
Esempio di creazione di un utente di Web service WSU_ES2000
-- Role: WSU_ES2000
-- DROP ROLE "WSU_ES2000";
CREATE ROLE "WSU_ES2000" LOGIN
ENCRYPTED PASSWORD 'md5817f55be3baecc1250c0aa77cf09b025'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT "es2000-wes-group" TO "WSU_ES2000";
COMMENT ON ROLE "WSU_ES2000" IS 'User Webservice, pwd=2000!wsu';