sto legando a cogliere il modo migliore per utilizzare la nuova funzionalità di protezione a livello di riga in un database multi-tenant che supporta un'applicazione web.PostgreSQL 9.5 - Row livello di sicurezza/RUOLO migliori pratiche
Attualmente, l'applicazione dispone di un paio di ruoli diversi a disposizione, a seconda dell'azione che sta cercando di prendere.
Una volta che l'applicazione effettua una connessione utilizzando il proprio RUOLO, l'applicazione passa i parametri di autenticazione (forniti dall'utente) in diverse funzioni che filtrano le righe in base ai parametri di autenticazione forniti dall'utente. Il sistema è progettato per funzionare con migliaia di utenti e sembra funzionare; tuttavia, è decisamente goffo (e lento).
Sembra che se volessi utilizzare la nuova funzionalità di sicurezza a livello di riga avrei bisogno di creare un nuovo RUOLO per ciascun utente del mondo reale (non solo per l'applicazione Web) per accedere al database.
È corretto? e se è così, è una buona idea creare migliaia di RUOLI nel database?
Aggiornamento da s' a_horse_with_no_name link nei commenti (grazie, quel filo è impeccabile):
CREATE USER application;
CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user = current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;
SET SESSION AUTHORIZATION application;
SET app_name.app_user = 'bob';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
1 | a | bob
(1 row)
SET app_name.app_user = 'alice';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
2 | b | alice
(1 row)
SET app_name.app_user = 'none';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
(0 rows)
Ora, sono confuso da current_setting('app_name.app_user')
come ero sotto la impressione era solo per i parametri di configurazione ... dove è definito app_name
?
http://www.postgresql.org/message-id/[email protected] –
@a_horse_with_no_name - inchiodato, grazie; comunque, l'esempio dato nel thread è un po 'criptico ... Ho aggiornato la domanda. – losthorse
** è ** per i parametri di "configurazione". Usarli per questo è essenzialmente un "hack". Non è necessario definirli prima di mano - questo può essere fatto dinamicamente. Si noti che 'current_setting ('app_name.app_user')' genererà un errore se il parametro non è stato definito prima. Per evitare ciò, è possibile definire un valore fittizio in 'postgresql.conf' –