使用名称作为键,我们如何在注册时通过忽略大小写来验证名称,同时还要记住显示时的大小写?
在config/initializers/devise.rb
中,在注册之前设置config.case_insensitive_keys = [ :name ]
似乎小写整个名称。
示例:一些家伙自称为TheFourthMusketeer。
答案 0 :(得分:6)
您可能会尝试不将:name
设置为不区分大小写,这样可以在数据库中正确保存区分大小写的名称:
config.case_insensitive_keys = []
然后,覆盖User上的find_first_by_auth_conditions
类方法,以按名称查找用户。请注意,此代码会因数据库而异(以下是使用Postgres):
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where("lower(name) = ?", login.downcase).first
else
where(conditions).first
end
end
这样做,User.find_for_authentication(login: 'thefourthmusketeer')
将使用name
“TheFourthMusketeer”正确返回记录。
有关覆盖此方法的说明,请参阅https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address。
答案 1 :(得分:1)
接受的答案是不完整的,因为它在注册时仍然区分大小写。例如,'username'和'USERNAME'都可以成功注册,但只有第一个能够登录。
在config/initializers/devise.rb
中禁用不区分大小写的密钥(这也可以是特定于模型的密钥,因此也请检查):
config.case_insensitive_keys = []
覆盖find_first_by_auth_conditions
的{{1}}方法:
models/user.rb
...并在def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:username)
where(conditions).where(["lower(username) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
中设置validates_uniqueness_of
:
models/user.rb
所以你有它:不区分大小写的身份验证,不区分大小写,在数据库中保留大小写。