2010-11-10 5 views
16

sto usando Devise con credenziali di accesso: E-mail/password - non nomi utenteRails - concepire, e-mail tra maiuscole e minuscole

Ho appena notato che il processo di login è case sensitive per le email. quindi se ti registri su [email protected] e poi tenti di accedere con [email protected], ottieni un errore. Molto confuso.

Come posso creare le persone del diario di registro con la loro e-mail/password e l'e-mail che non fa distinzione tra maiuscole e minuscole?

+0

Nota: Il comportamento descritto in precedenza non lo fa (? Come di 1.2) sembra essere più il comportamento di default. –

risposta

10

Un'opzione è di ignorare il metodo di ricerca utilizzato da Idea. Qualcosa di simile:

# User.rb 
before_save do 
    self.email.downcase! if self.email 
end 

def self.find_for_authentication(conditions) 
    conditions[:email].downcase! 
    super(conditions) 
end 
+0

Grazie Kevin. Esiste comunque la possibilità di consentire all'utente di salvare la propria e-mail in qualsiasi modo, ma utilizzare find_for_authentication per eseguire il downcase di ciò che viene immesso e cosa c'è nel database per evitare questo problema? Pensieri? – AnApprentice

+0

È possibile. Molto probabilmente dovrai eseguire l'override di 'find_for_authentication completamente 'senza la chiamata genitore (ed eseguire la ricerca tu stesso) ma non sono esattamente sicuro di quali condizioni sono state inoltrate. –

+0

Qualcuno ha capito la soluzione per archiviarlo con distinzione tra maiuscole e minuscole ma facendolo senza distinzione tra maiuscole e minuscole durante l'accesso? – Bob

4

ho aggiunto questo al mio modello User per memorizzarlo tra maiuscole e minuscole, ma renderla maiuscole e minuscole durante l'accesso:

def self.find_for_database_authentication(conditions = {}) 
    self.where("LOWER(email) = LOWER(?)", conditions[:email]).first || super 
end 

Funziona su Heroku.

A proposito, questa è solo una soluzione temporanea in quanto il problema è stato risolto e questo sarà il comportamento predefinito su Devise 1.2. Vedi this pull request per i dettagli.

+0

Penso davvero che questa sia la risposta migliore, specialmente su un'app in cui le e-mail sono visibili a (alcuni) utenti. Le persone dovrebbero avere la possibilità di scrivere le e-mail come preferiscono, INOLTRE questo non richiede l'aggiornamento del database corrente. – brittohalloran

+0

Si noti che la correzione nella richiesta pull è * non * uguale al codice fornito da Andrés. I dispositivi più recenti cercheranno solo le email downcased se configurate in questo modo, ma non garantiranno che i campi di posta elettronica vengano scaricati quando vengono salvati. Avrai ancora problemi nel trovare un indirizzo email downcased se ha capitalizzazione nel db con le nuove versioni di devise, mentre il codice sopra cercherà correttamente versioni in modo diverso in maiuscolo. –

+0

Si noti inoltre che come [i commenti qui] (https://github.com/plataformatec/devise/blob/3d9dea39b2978e3168604ccda956fb6ec17c5e27/lib/devise/models/authenticatable.rb#L237) menzionano, questo renderà le email non sensibili alle maiuscole/minuscole per l'autenticazione e non per la reimpostazione della password, ad esempio. –

0

Ho anche avuto qualche soluzione che rendere il lavoro con la posta elettronica è case-insensitive per tutti Devise controllori (funzionalità):

class ApplicationController < ActionController::Base 
... 
... 
    prepend_before_filter :email_to_downcase, :only => [:create, :update] 
... 
... 
    private 
... 
... 
    def email_to_downcase 
    if params[:user] && params[:user][:email] 
     params[:user][:email] = params[:user][:email].downcase 
    end 
    end 
... 
... 
end 

So che non è la soluzione migliore: si tratta di un altro controller di un altro modelli e esegue codice che non è necessario per loro. Ma era solo di fortuna e funziona (almeno per me;)).

Kevin e Andres, grazie per le vostre risposte. È davvero una buona soluzione e utile. Volevo votarli, ma non ho ancora abbastanza reputazione. Quindi, dico solo "grazie" a te. ;)

Lets attendere Devise 1.2

59

Si può facilmente risolvere il problema come qui di seguito.

# config/initializers/devise.rb 
Devise.setup do |config| 
    config.case_insensitive_keys = [:email, :username] 
end 
+1

Questo sembra il modo più corretto per rendere il login insensibile alle maiuscole. (E ha funzionato per me - Grazie!) – thewillcole

+0

Confermato il 15/02/2012 su Devise 1.4.2. Non è nella wiki in linea, per quanto posso dire, –

+3

Assicurati di eseguire una migrazione per eliminare eventuali e-mail o nomi utente esistenti nel database. –