2013-08-01 5 views
0

Я пытаюсь вручную шифровать пароль для целей сравнения. Я думаю, что this - это метод, который мне нужно позвонить, , но Sorcery::Model.encrypt('password') не работает?Колдовство вручную шифрование пароля

я получаю NoMethodError: undefined method encrypt for Sorcery::Model:Module

+0

Я извиняюсь, потому что это не отвечает на ваш вопрос, но почему вы пытаетесь зашифровать пароли вручную, если используете систему аутентификации? Вам не нужно вообще управлять шифрованием паролей, используя колдовство. –

+0

Я создаю обновление вашей парольной функции, в которой вам нужно ввести свой предыдущий пароль (то есть исходный пароль) в дополнение к вашему новому, и поэтому мне нужно хэш-код «оригинала», чтобы сравнить его с текущим паролем пользователя чтобы убедиться, что они совпадают, прежде чем разрешить им сбросить свой пароль – Lee

+0

вместо 'User.load_from_reset_password_token (токен)'? –

ответ

2

Я получил решение для этого.

Предполагается, что колдовство находится по умолчанию.

По мнению: (я использую тонкий для шаблона)

= form_for @user do |f| 
    = f.label :old_password 
    = f.password_field :old_password 
    = label_tag :old_password 
    = password_field_tag :old_password 
    = f.label :password" 
    = f.password_field :password 
    = f.label :password_confirmation 
    = f.password_field :password_confirmation 
    = f.submit "Submit", class: "button" 

Затем в контроллере, вы можете сделать это:

def update 
    @user = User.find(id) # find the user first. 
    # this is the magic, use the saved crypted_password and salt to authenticate user's password 
    authenticate = BCrypt::Password.new(@user.crypted_password) == params[:old_password] + @user.salt 
    if authenticate && @user.update_attributes(params[:user]) 
    ... # updated and redirect or whatever. 
    else 
    ... # fail 
    end 
end 

Если вы используете другой способ склеп пароль, вам нужно измените магическую линию для правильного метода.

Возможно, полезно.

0

Я хотел добавить к предыдущему вопросу, что его лучше перенести проверки на модель. И немного Гочи является то, что при инициализации модели с новыми password и password_confirmation атрибутами, он обновляет текущие crypted_password и salt атрибутов в before_validation фильтре, поэтому проверка должна быть что-то вроде этого, используя грязный tracki:

unless BCrypt::Password.new(self.crypted_password_was) == (old_password + self.salt_was) 
    errors.add(:old_password, 'is wrong') 
end 
Смежные вопросы