2013-06-20 9 views
13

Ho trovato molto difficile eseguire il recupero della password, poiché non l'ho mai fatto prima.Guida all'implementazione del ripristino della password di sicurezza primavera con URL dinamico inviato all'e-mail

Finora ho web app che ha:

Primavera di sicurezza, dove password è correttamente eseguito l'hashing e ruoli utente implementato e funziona correttamente.

La strategia suggerimenti di ricerca da StackOverflow: pulsante

  1. colpi utente ha dimenticato la password-, dove entra nel suo indirizzo di posta elettronica.
  2. collegamento dinamico viene inviato all'indirizzo e-mail
  3. apre utente link nella e-mail
  4. Che lo reindirizza alla reimpostazione della password pagina

Ciò che non è noto:

  • Come dare collegamento natura dinamica - metodi di generazioni
  • Link ha un timeout - alcune domande sono state trovate qui, ma spesso coinvolgono il gestore personalizzato o l'estensione di primavera sec funzionalità di sicurezza
  • Un metodo di mappatura delle richieste per rispondere a tale collegamento dinamico
  • Metodi di memorizzazione di collegamenti temporanei: database, sessione ecc.?

Come si può vedere l'elenco è piuttosto grave per una singola domanda. Quindi speravo potessi essere in grado di fornire risorse guida su come farlo passo dopo passo. Ero un po 'sorpreso di non aver trovato molto su questo nella documentazione di Spring Security. Grazie.

Sono uno studente, quindi non conosco le migliori pratiche del settore per farlo, specialmente nel contesto di Java, quindi spero davvero che qualcuno sia in grado di aiutare.

+0

Ho implementato un progetto JAVA per questo caso d'uso. È su GitHub, open source. Puoi dare un'occhiata: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows – OhadR

risposta

18

Il problema non ha molto a che fare con Spring Security. A patto di conoscere la struttura del database utente e il codificatore della password utilizzati, si tratta solo di implementare un flusso di lavoro che coinvolge l'accesso ai dati, i controller Web e l'invio di e-mail. Il collegamento deve contenere una stringa token casuale (utilizzare SecureRandom e un codificatore base64, ad esempio) e deve essere memorizzato in un database con userId e un timestamp (per convalidare la finestra entro cui il link è valido). Il controllore estrae semplicemente il token dalla richiesta in arrivo, carica i dati dal database usando il token. Controllerebbe il timestamp e quindi inoltrerà l'utente a un modulo di immissione della password. A seconda dei requisiti, potresti anche volere che rispondano anche ad altre domande di sicurezza. Dovresti quindi convalidare e codificare la password e memorizzarla nell'account corrispondente alla userId memorizzata nella tabella dei link di reset. Avrebbe anche senso avere un lavoro batch in esecuzione per rimuovere i collegamenti scaduti dal database.

Il plug-in UI di Grails Spring Security ha già un'opzione forgot password che è possibile utilizzare direttamente o utilizzare come riferimento.

+0

grande, semplice e conciso. Credo che la generazione di hash di emailadress + timestamp (as salt) farebbe il lavoro per la generazione di link? Anche solo per un rapido riferimento per rispondere al collegamento dinamico uso qualcosa come: \t @RequestMapping (valore = "/ var/{nome}", metodo = RequestMethod.GET) – Aubergine

+0

Potresti confermarlo prima di accettare? :-) – Aubergine

+0

Perché usare un hash? Avresti comunque bisogno di memorizzare il token per verificarlo e i timestamp sono ipotizzabili. Se avessi saputo che qualcuno aveva richiesto un reset e conosceva la loro e-mail, potevo semplicemente scorrere tutti i possibili timestamp su una finestra appropriata fino a quando il sistema non mi ha fatto entrare. Usa byte casuali per il token di collegamento e fallo abbastanza a lungo da non indurli dobbiamo preoccuparcene (ad es. 16 byte). –

5

Ho implementato un progetto JAVA per questo caso d'uso. È su GitHub, open source.

C'è una spiegazione per tutto (e se manca qualcosa - fammi sapere ...)


dare un'occhiata: https://github.com/OhadR/Authentication-Flows

Questo è il web-app client che utilizza i Auth-flussi, con il README con tutte le spiegazioni. ti dirige l'implementazione: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows

+0

È abbastanza stabile da adattarsi per l'uso in produzione? – Kafkaesque

+0

è una buona domanda. In breve: SI. Si noti che per la produzione, ognuno (di solito) ha i propri bisogni. per esempio, ci sono aziende che hanno bisogno di un meccanismo di "domanda segreta", che non ho implementato. ma è una buona base da cui partire e aggiungere tutto ciò che è necessario. dare un'occhiata nel README. fammi sapere se qualcosa non è chiaro. e sì - è stabile :-) NOTA: ho cambiato i link nella mia risposta. dai un'occhiata .. – OhadR

+0

Ciao @ OhadR: Mi riferisco al tuo progetto, è utile per me, ho ricevuto un'eccezione: AuthenticationFlowsProcessorImpl - Autenticazione fallita; l'eccezione nidificata è javax.mail.AuthenticationFailedException, UserActionController - L'account è bloccato o non esiste, ho controllato e i dati utente sono stati inseriti in db –