Postgres ruoli per gli utenti del sito web

4

Sto configurando un database PostgreSQL con un numero molto ridotto di tabelle per un sito web semplice. Sto cercando dei modi per renderlo il più solido e controllabile possibile. C'è qualche ragione particolare per cui dovrei o non dovrei creare un ruolo PostgreSQL per ogni account utente sul sito web? L'idea è che potrei quindi utilizzare le autorizzazioni a livello di riga su tabelle contenenti informazioni personali o private e le query assomigliano a qualcosa del tipo:

-- Service logs in with role mywebsite and runs:
BEGIN
SET LOCAL ROLE charlie; -- A user on the website
INSERT ...              -- DO STUFF
COMMIT;

Il codice di registrazione dovrebbe quindi conoscere sia l'account di sistema (mywebsite nell'esempio precedente) utilizzato per accedere al database sia l'utente per conto del quale vengono apportate modifiche (charlie). I due sono disponibili in PostgreSQL come session_user (uid) e current_user (euid).

Se conosci precedenti o motivi per cui questa sarebbe un'idea grandiosa o terribile, mi piacerebbe saperlo.

    
posta Max Murphy 25.01.2016 - 21:56
fonte

1 risposta

1

I ruoli vengono generalmente utilizzati per raggruppare gli utenti. Ad esempio, abbiamo diversi moderatori sui programmatori. Piuttosto che creare un ruolo per ogni utente, è probabile che un ruolo di "moderatore" sia assegnato a più utenti. In questo modo è facile vedere chi appartiene a quale gruppo e modificare le autorizzazioni per più utenti contemporaneamente.

Sembra che tu abbia un caso classico di "il mio sito web ha più utenti, ma il sito web utilizza un solo account utente per accedere al database" comune alla maggior parte delle applicazioni web pubbliche.

L'utilizzo dei ruoli per identificare gli utenti del sito Web non è ciò che è stato progettato per tale funzione e potrebbe ostacolare il coinvolgimento dell'utente in futuro, se sono necessari ruoli per altri scopi. Duplica anche la funzionalità: se riesci a creare ruoli, perché non creare solo utenti aggiuntivi?

Penso che un approccio qui sarebbe quello di nix l'approccio basato sui ruoli e basta modificare direttamente i dati. Anziché utilizzare la registrazione incorporata, è possibile creare una tabella di registrazione separata in cui è possibile registrare l'evento. Potrebbe contenere campi per quanto segue:

  • Utente di PostgreSQL
  • Utente dell'applicazione
  • Tabella modificata
  • Campo modificato
  • Note (testo in formato libero, qualunque sia rilevante)

Non vorrei sostenere l'uso di questo registro per ogni modifica, solo quelli importanti che richiedono una traccia di controllo.

Un'altra opzione che ho visto è quella di includere le informazioni sullo stato dei record su ogni tabella in cui è richiesta la responsabilità. Non mantiene una cronologia, ma potrebbe essere sufficiente se hai solo bisogno della modifica più recente. Diversi framework open source fanno questo. Puoi aggiungere i seguenti campi alle tabelle importanti:

  • Utente di PostgreSQL
  • Utente dell'applicazione
  • Data di modifica
risposta data 25.01.2016 - 22:32
fonte

Leggi altre domande sui tag