2012-01-17 3 views
0

Приложение My Rails использует данные из старой базы данных. Импортированные пользователи из этого БД содержат дубликаты писем. Аутентификация выполняется с помощью электронной почты + пароль (и это уникальная комбинация в БД). Devise использует метод find_for_database_authentication, чтобы найти пользователя. Однако параметры не содержат пароля (только имя входа).Найти пользователя, используя адрес электронной почты + пароль в Devise

Что я могу сделать?

ответ

1

Вы можете найти этот путь

в модели пользователя переопределить метод найти:

def self.find_for_database_authentication(warden_conditions) 
    conditions = warden_conditions.dup 

    email = conditions.delete(:email) 
    pwd = conditions.delete(:password) 
    encrypted_pwd = User.new(password: pwd).encrypted_password 

    where(conditions).where(["lower(email) = :email AND encrypted_password = :pwd", { :email => email.strip.downcase, :pwd => encrypted_pwd }]).first 
end 

и, вероятно, конфигурации/Инициализаторы/devise.rb потребует как л:

config.authentication_keys = [ :email, :password ] 
+0

Метод self.find_for_database_authentication находится в классе модели пользователя, а параметры недоступны – maxs

+0

Я имею в виду, что вы можете получить форму encrypted_password, используя User.new, с учетными данными, которые у вас есть. Отредактировано ответ в соответствии с вашим комментарием – alony

+0

Это находится в Devise controller (in gem), а не в контроллере – maxs

2

попробуйте следующее:

find_user = User.where("email = ?", params["user"]["email"]).first 
find_user.valid_password?(params["user"]["password"]) 
+0

+ 1 (работа для меня) – 3lviend

Смежные вопросы