AnApprentice
AnApprentice

Reputation: 111030

Rails - Devise, Email Case Insensitivity

I'm using Devise with login credentials: email/password - no usernames

I just noticed that the login process is case sensitive for emails. so if you register with [email protected], and then try to log in with [email protected] you get an error. Very confusing.

How can I make devise log people in with their email/password, and the email being case insensitive?

Upvotes: 23

Views: 10470

Answers (5)

heyjinkim
heyjinkim

Reputation: 771

You can easily fix the issue like below.

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

Upvotes: 76

shpakvel
shpakvel

Reputation: 79

I also had some solution which making work with email is case-insensitive for all Devise controllers (functionality):

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

I know it is not the best solution: it involves another controllers of another models and executes code which is not necessary for them. But it was just makeshift and it works (at least for me ;) ).

Kevin and Andres, thanks for your answers. It is really good solutions and useful. I wanted to vote them up, but I haven't enough reputation yet. So, I just tell 'thanks' to you. ;)

Lets wait for Devise 1.2

Upvotes: 0

Andr&#233;s Mej&#237;a
Andr&#233;s Mej&#237;a

Reputation: 589

I added this to my User model to store it case-sensitive but make it case-insensitive during sign in:

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

It works on Heroku.

By the way, this is just a temporary fix as the issue has been resolved and this will be the default behavior on Devise 1.2. See this pull request for details.

Upvotes: 6

Kevin Sylvestre
Kevin Sylvestre

Reputation: 38052

One option is to override the find method used by devise. Something like:

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

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

Upvotes: 11

Related Questions