Domanda

Quando crei un'applicazione web e diciamo che hai un oggetto Utente che denota un singolo utente, quale pensi sia il modo migliore per memorizzare che l'utente ha effettuato l'accesso?

Due modi a cui ho pensato sono stati:

  • Memorizzato l'ID del database utente in una variabile di sessione
  • Memorizzato l'intero oggetto utente in una variabile di sessione

Eventuali suggerimenti migliori, eventuali problemi con l'utilizzo dei metodi di cui sopra?Forse problemi di sicurezza o problemi di memoria, ecc. Ecc.

È stato utile?

Soluzione

Consiglio di memorizzare l'ID anziché l'oggetto.Lo svantaggio è che devi accedere al database ogni volta che desideri ottenere le informazioni di quell'utente.Tuttavia, a meno che ogni millisecondo non conti nella tua pagina, le prestazioni non dovrebbero essere un problema.Ecco due vantaggi:

  1. Se le informazioni dell'utente cambiano in qualche modo, non memorizzerai informazioni obsolete nella sessione.Ad esempio, se a un utente vengono concessi privilegi aggiuntivi da un amministratore, questi saranno immediatamente disponibili senza che l'utente debba disconnettersi e quindi accedere nuovamente.

  2. Se le informazioni sulla sessione sono archiviate sul disco rigido, puoi archiviare solo dati serializzabili.Pertanto, se il tuo oggetto Utente contiene qualcosa come una connessione al database, un socket aperto, un descrittore di file, ecc., allora questo non verrà archiviato correttamente e potrebbe non essere nemmeno ripulito correttamente.

Nella maggior parte dei casi queste preoccupazioni non costituiranno un problema e entrambi gli approcci andrebbero bene.

Altri suggerimenti

Per motivi di sicurezza, genererei (un GUID o un RNG crittograficamente sicuro) un ID di sessione e avrei una tabella che associa semplicemente gli ID di sessione agli ID utente.Quindi, memorizzi semplicemente l'ID di sessione nei loro cookie e lo fai agire come proxy per l'ID utente.

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

In questo modo nessuno potrà impersonare un altro utente indovinandone l'ID.Ti consente anche di limitare le sessioni degli utenti in modo che debbano accedere di tanto in tanto (due settimane è la norma).E se desideri memorizzare altri dati sulla loro sessione, puoi semplicemente aggiungerli a questa tabella.

Ricorda solo che se memorizzi tutti gli attributi dell'utente (questo si estende alle autorizzazioni) nella sessione, qualsiasi modifica all'utente non avrà effetto finché non accederà nuovamente.

Personalmente, memorizzo il nome e l'ID per un rapido riferimento e recupero il resto quando ne ho bisogno.

Memorizzare l'ID è la pratica migliore nella maggior parte dei casi.Una ragione importante per questo è la scalabilità.Se memorizzi l'oggetto utente (o qualsiasi entità dal database, anziché solo i loro ID), incontrerai problemi nell'espansione del numero di server che servono il tuo sito.Per ulteriori informazioni, cerca su Google "architettura senza condivisione".

Penso che dipenda da quale piattaforma stai utilizzando.Se utilizzi ASP.net, darei sicuramente un'occhiata a Autenticazione moduli class e tutte le funzionalità integrate (ed estensibili) che puoi utilizzare per memorizzare le impostazioni dell'utente che ha effettuato l'accesso.

Memorizzerei un valore hash dell'ID utente e dell'ID sessione e quindi lo abbinerei in una tabella delle sessioni nel database.In questo modo sarà più difficile falsificare i dati della sessione.Potrei controllare anche l'IP come controllo aggiuntivo.

Non sono sicuro di voler fare affidamento sul fatto che un ID utente venga memorizzato in una variabile di sessione e confidare che si tratti di quell'utente poiché potrebbe essere modificato abbastanza facilmente e ottenere l'accesso come un altro membro

Di solito memorizzo l'utente nella sessione.Il problema dell'impossibilità di modificare fino al login può essere risolto sostituendo l'oggetto nella sessione con una nuova copia dopo aver apportato le modifiche.

Il nostro oggetto utente è abbastanza leggero, quindi abbiamo deciso di memorizzarlo in una variabile di sessione.Non sono sicuro che sia il più efficiente, ma finora funziona molto bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top