2010-11-10 26 views
16

estoy usando Diseñar con credenciales de inicio de sesión: correo electrónico/contraseña - no hay nombres de usuarioRieles - Diseñar, correo electrónico mayúsculas y minúsculas

Acabo de notar que el proceso de conexión entre mayúsculas y minúsculas para los mensajes de correo electrónico. entonces si te registras con [email protected], y luego tratas de iniciar sesión con [email protected], obtienes un error. Muy confuso.

¿Cómo puedo idear personas de registro con su correo electrónico/contraseña, y el correo electrónico no distingue entre mayúsculas y minúsculas?

+0

Nota: El comportamiento descrito anteriormente no lo hace (? Como de 1,2) parece ser el comportamiento por defecto más. –

Respuesta

10

Una opción es anular el método de búsqueda utilizado por el dispositivo. Algo así como:

# 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

Gracias Kevin. ¿Hay alguna forma de dejar que el usuario guarde su correo electrónico de la forma que quiera, pero use find_for_authentication para descifrar lo que se ingresó y lo que está en la base de datos para evitar este problema? ¿Pensamientos? – AnApprentice

+0

Es posible. Lo más probable es que tenga que anular 'find_for_authentication fully' sin la llamada primaria (y realice la búsqueda usted mismo), pero no estoy exactamente seguro de las condiciones que se pasen. –

+0

¿Alguien averiguó la solución para almacenarla pero haciendo que sea más fácil? distingue entre mayúsculas y minúsculas durante el inicio de sesión – Bob

4

he añadido esto a mi modelo de usuario para almacenarlo entre mayúsculas y minúsculas pero que sea sensible a las mayúsculas durante la inscripción en:

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

Funciona en Heroku.

Por cierto, esto es solo una solución temporal ya que el problema se ha resuelto y este será el comportamiento predeterminado en Devise 1.2. Vea this pull request para más detalles.

+0

Realmente creo que esta es la mejor respuesta, especialmente en una aplicación donde los correos electrónicos son visibles para (algunos) usuarios. Las personas deberían tener la opción de capitalizar su correo electrónico a su gusto, ADEMÁS, esto no requiere la actualización de su base de datos actual. – brittohalloran

+0

Tenga en cuenta que la corrección en la solicitud de extracción es * no * la misma que el código proporcionado por Andrés. Los dispositivos más nuevos solo buscarán correos electrónicos descifrados si están configurados, pero no garantizarán que los campos del correo electrónico se descarten cuando se guarden. Todavía tendrá problemas para encontrar una dirección de correo electrónico descartada si tiene mayúsculas en el archivo db con las versiones de diseño más nuevas, mientras que el código anterior buscará con éxito versiones en mayúsculas diferentes. –

+0

También tenga en cuenta que, como [los comentarios aquí] (https://github.com/plataformatec/devise/blob/3d9dea39b2978e3168604ccda956fb6ec17c5e27/lib/devise/models/authenticatable.rb#L237) mencionan, esto solo hará que los correos electrónicos sean insensibles a las mayúsculas y minúsculas para la autenticación y no para el restablecimiento de contraseña, por ejemplo. –

0

También he tenido algunos solución que hacer que el trabajo con el correo electrónico es sensible a las mayúsculas para todos los controladores Idear (funcionalidad):

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 

Sé que no es la mejor solución: se trata de otros controladores de otros modelos y ejecuta código que no es necesario para ellos. Pero fue solo improvisado y funciona (al menos para mí;)).

Kevin y Andres, gracias por sus respuestas. Es realmente buenas soluciones y útiles. Quería votar por ellos, pero todavía no tengo suficiente reputación. Entonces, solo les digo 'gracias'. ;)

Lets esperar a 1.2 Diseñar

59

Usted puede fijar fácilmente el tema, como a continuación.

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

Parece la manera más correcta de hacer que el inicio de sesión no distinga entre mayúsculas y minúsculas. (Y funcionó para mí - ¡Gracias!) – thewillcole

+0

Confirmado el 15/02/2012 en Devise 1.4.2. No está en el wiki en línea, por lo que puedo decir, –

+3

Asegúrese de ejecutar una migración para descargar cualquier correo electrónico o nombre de usuario existente en la base de datos. –

Cuestiones relacionadas