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

时间:2012-05-10 10:22:33

标签: ruby-on-rails ruby-on-rails-3 devise

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

这是一个相当明显和必要的功能,很多人似乎已经问过它,但我一直磕磕绊绊的解决方案似乎与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"
#=> <User username="username"...>

我错过了一些非常明显的东西吗?

1 个答案:

答案 0 :(得分:11)

来自devise wiki:您需要在模型中覆盖设计的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

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

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

相关问题