我将所有用户的电子邮件存储在一个单独的表中。每个用户都有很多电子邮件。我遇到的问题是如何设计使用这些电子邮件登录而不是查看用户表。我知道我需要在find_for_database_authentication方法中加入某种条件,但我似乎无法弄明白。我试过类似下面的东西,但没有运气:
login = conditions.delete(:login)
where(conditions).where(:emails => { :name => login }).first
答案 0 :(得分:4)
不确定我是否以正确的方式做到了这一点,但我刚刚在config / initializers / devise.rb中创建了一个新策略
require 'devise/strategies/authenticatable'
module Devise
module Strategies
class MultipleEmailAuthenticatable < Authenticatable
def authenticate!
email = Email.find_by_email_address(authentication_hash[:email])
unless email
fail(:invalid)
return
end
resource = valid_password? && email.member
if validate(resource){ resource.valid_password?(password) }
resource.after_database_authentication
success!(resource)
elsif !halted?
fail(:invalid)
end
end
end
end
end
您在哪里覆盖find_for_database_authentication方法?
答案 1 :(得分:1)
是否可以使用电子邮件地址以外的其他内容登录?如果您允许用户使用用户名等登录,则会有devise wiki article on the subject。