Qual è il modo migliore per modulare uno schema utente in modo che sia generico

4

Ho una domanda sulla progettazione del database. Fondamentalmente voglio essere in grado di creare uno schema per un modello utente, quindi utilizzare questo modello utente in altri modelli che estendono l'utente ma voglio progettarlo in modo tale che sia abbastanza generico da essere utilizzato in ogni applicazione.

Ad esempio, un modello di profilo o account potrebbe estendere l'utente e, in entrambi i casi, saranno diversi in base all'applicazione Web che si sta progettando, ma le credenziali principali dell'utente non dovrebbero mai essere diverse tra tutte le applicazioni Web.

Quali campi pensi che dovrebbero essere nel modello utente?

Penso che il minimo indispensabile per gestire correttamente l'autenticazione sia:

  • email (l'identificatore univoco di accesso)
  • salt (ovviamente!)
  • password (duh)
  • lostToken (un hash per verificare la funzionalità della password smarrita)
  • ruolo (membro, amministratore, editor, ecc. IMO questo elenco di ruoli sarebbe diverso tra i siti, tuttavia è troppo importante per il modello utente non avere qui?)

Ora entriamo in altri campi interessanti che sono ancora molto utili:

  • createdAt (quando l'account è stato creato)
  • ipAddress (traccia l'IP quando è stato creato l'account)
  • refererUrl (da quale sito proviene)
  • lastLoggedIn (l'ultima volta che l'utente ha effettuato l'accesso)
  • isOnline (è l'utente attualmente online)

E ancora più campi che sono ancora piuttosto utili:

  • nome utente (potrebbe non essere utilizzato su ogni sito)
  • numero di accessi consecutivi (simile alla rete dello stack)

Penso che qualsiasi altra cosa come i dati sociali (Mi piace, voti, viste del profilo), distintivi / risultati, l'ultima volta che hanno aggiornato il loro profilo / account / qualsiasi cosa, e altre informazioni come il loro nome appartengono al modello Profilo per sito.

Che ne pensi?

Modifica: Capisco perfettamente che questa domanda è in parte soggettiva, ma penso che ci sia sicuramente spazio per la discussione.

    
posta AntelopeSalad 14.03.2012 - 16:18
fonte

2 risposte

4

Il mio primo istinto sarebbe quello di riutilizzare un meccanismo di autorizzazione utente esistente, piuttosto che scriverne uno. Quindi salterò il resto finché non avrò dei requisiti rigidi. La generalizzazione prematura è altrettanto negativa dell'ottimizzazione prematura.

    
risposta data 14.03.2012 - 16:48
fonte
2

Consiglierei per un database separato, utilizziamo STS e SQL Server per il nostro schema "User Store". Contiene circa:

  • Tabella utente: contiene UserID, hash della password, ecc. Ha anche un Campo ID che è un identificatore per l'utente diverso dall'ID utente.
  • Verifica utente: contiene informazioni di controllo ogni volta che l'utente autentica, URL, indirizzo IP, ecc.
  • Applicazione - Applicazioni conosciute nel sistema
  • Ruoli: un ruolo è un elenco di criteri
  • Criterio - Politiche specifiche
  • Ambiente - Ambienti definiti (DB SQL Server)
  • Licenza (abbiamo fatto il nostro), probabilmente non è nello schema

Quando un utente si autentica, come parte di quel processo, è necessario sapere quale applicazione e quale ambiente stanno usando / andando. Un utente può avere più ambienti per un applicin (Dev, Test, Integration, Production), quindi c'è quel livello di separazione. Una volta che lo sappiamo, allora cerchiamo lì il ruolo e la politica impostata per quell'applicazione / ambiente e lo memorizziamo nel token. A quel punto l'utente si è autenticato e conosciamo quell'utente tramite il suo ID. Hanno anche il loro set di politiche prontamente disponibile per qualsiasi logica specifica dell'applicazione, poiché ovunque vada, il token segue. UserID e password sono fuori dall'immagine e l'applicazione non ne ha più bisogno o la usa, e ora tutti i riferimenti sono per ID, non UserID.

È generico nel senso che se un altro team sviluppa un'applicazione, tutto ciò che devono definire è l'applicazione, i ruoli e le politiche e quindi possono utilizzare l'STS impostato. Poiché abbiamo un ID comune per identificare l'utente, l'applicazione stessa può avere ulteriori tabelle definite per qualsiasi attributo specifico dell'applicazione, se necessario.

Ad esempio, i badge e i risultati non verrebbero archiviati nell'archivio utente, ma verrebbero archiviati nello schema dell'applicazione e saranno referenziati dall'ID dell'utente.

Fondamentalmente, l'archivio utente è generico quando si autentica solo. Inoltre, l'abbiamo esteso per consentire alle applicazioni di contenere anche le informazioni di autorizzazione.

Facendo ciò, possiamo creare una console di amministrazione per qualsiasi numero di applicazioni in grado di controllare l'autenticazione e l'autorizzazione dell'utente. Qualsiasi attributo utente oltre l'autenticazione e possibilmente l'autorizzazione devono essere memorizzati altrove.

    
risposta data 14.03.2012 - 22:03
fonte

Leggi altre domande sui tag