2010-11-10 54 views
16

我使用的设计与登录凭证:电子邮件/密码 - 没有用户名导轨 - 设计,电子邮件不区分大小写

我只注意到了登录过程的情况下对电子邮件敏感。所以如果您通过[email protected]注册,然后尝试使用[email protected]登录,则会出现错误。很混乱。

我该如何使用他们的电子邮件/密码设计日志用户,并且该电子邮件不区分大小写?

+0

注:上述行为不会(?为1.2),似乎是默认的行为了。 – 2011-06-27 18:44:08

回答

10

一个选项是重写devise使用的find方法。喜欢的东西:

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

它的工作原理在Heroku:

# 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

谢谢凯文。无论如何,无论如何都要让用户保存他们的电子邮件,但是使用find_for_authentication来处理输入内容和数据库中的内容以避免此问题?思考? – AnApprentice 2010-11-10 19:21:43

+0

这是可能的。你很可能必须在没有父调用的情况下完全重写'find_for_authentication'(并且自己执行查找),但我不确定传入的条件是什么。 – 2010-11-10 19:32:14

+0

有没有人找出存储区分大小写的解决方案,在登录时不区分大小写? – Bob 2010-12-02 08:27:12

4

我签过程中添加到了我的用户模型来存储它区分大小写但要区分大小写。

顺便说一句,这只是一个临时的解决方案,因为问题已经解决,这将成为Devise 1.2的默认行为。详情请参阅this pull request

+0

我真的认为这是最好的答案,特别是在某些应用程序中,某些用户可以看到电子邮件。人们应该可以根据自己的喜好选择大写电子邮件,PLUS不需要更新当前的数据库。 – brittohalloran 2012-06-22 20:05:59

+0

请注意,拉请求中的修正*与安德列斯提供的代码不同。如果配置如此,较新的设备将仅搜索降级的电子邮件,但不保证电子邮件字段在保存时被降级。如果在具有较新设计版本的数据库中使用大写,则仍然会遇到问题,并且上面的代码将成功查找不同的大写版本。 – 2014-07-01 14:59:33

+0

同时请注意,[这里的评论](https://github.com/plataformatec/devise/blob/3d9dea39b2978e3168604ccda956fb6ec17c5e27/lib/devise/models/authenticatable.rb#L237)提到,这样只会让邮件不区分大小写认证例如,不用于密码重置。 – 2014-07-01 15:37:18

0

我也有一些解决方案,它使用电子邮件的工作是不区分大小写的所有设计控制器(功能):

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 

我知道这是不是最好的解决方案:它涉及到另一个模式的另一个控制器和执行它们不需要的代码。但它只是暂时的,它起作用(至少对我而言))。

Kevin和Andres,谢谢你的回答。这是非常好的解决方案和有用的。我想给他们投票,但我还没有足够的声望。所以,我只是对你说'谢谢'。 ;)

让等待设计1.2

59

您可以轻松地解决这个问题像下面。

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

这看起来像使登录不区分大小写的最正确方法。 (它只是为我工作 - 谢谢!) – thewillcole 2012-02-12 01:39:37

+0

确认2012年2月15日在设计1.4.2。这不是在网上的维基据我可以告诉 – 2012-02-16 04:34:39

+3

请确保运行迁移到downcase数据库中的任何现有的电子邮件或用户名,以及。 – 2012-06-02 18:15:40