设计:允许用户注册为“UsErNaMe”,但使用“用户名”登录

与大多数网站的工作方式相同,我将“UsErNaMe”存储在数据库中,但允许用户使用“用户名”登录。

这是一个相当明显和必要的function,很多人似乎已经问过它,但我一直磕磕绊绊的解决方案似乎与Devise自己的文档没有关系。

例如,请考虑此博客文章: http : //anti-pattern.com/2011/5/16/case-insensitive-keys-with-devise

[…]你可能遇到了一些用户喜欢用大写字母在他们的登录名(电子邮件和/或用户名)中输入某些字母的问题,但是当他们尝试登录时,他们希望它不区分大小写。没有不合理的要求[…]

凉! 这就是我想要的。

他的解决方案

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

这是我一直在寻找的解决方案。 但这是该配置选项的文档:

 # Configure which authentication keys should be case-insensitive. # These keys will be downcased upon creating or modifying a user and when used # to authenticate or find a user. Default is :email. config.case_insensitive_keys = [ :username, :email ] 

特别是:“这些密钥将在创建/修改用户时下降。” 换句话说,用户名在数据库中被降级。

核实:

 User.create username: "UsErNaMe", password: "secret", email: "email@com.com" #=>  

我错过了一些痛苦明显的东西吗?

从设计维基 :您需要在模型中覆盖设计的find_first_by_auth_conditions方法。

ActiveRecord示例:

 def self.find_first_by_auth_conditions(warden_conditions) conditions = warden_conditions.dup if login = conditions.delete(:login) where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first else where(conditions).first end end 

如果您不需要通过电子邮件validation,也可以删除OR lower(email) = :value part。

这样,您不需要在case_insensitive_keys列出username ,也不会在数据库中将其下载。