巫术手动加密密码

时间:2013-08-01 10:27:05

标签: ruby-on-rails sorcery

我正在尝试手动加密密码以进行比较。 我认为this是我需要调用的方法, 但Sorcery::Model.encrypt('password')不起作用?

我不断获得NoMethodError: undefined method encrypt for Sorcery::Model:Module

2 个答案:

答案 0 :(得分:2)

我得到了一个解决方案。

假定法术属于默认设置。

在视图中:(我使用slim模板)

= 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

如果您使用其他方法来加密密码,则需要更改魔术线以获得正确的方法。

也许有帮助。

答案 1 :(得分:0)

我想在上一个问题中添加更好的方法来将验证移到模型中。 还有一点是,当您使用新的passwordpassword_confirmation属性初始化模型时,它会更新crypted_password过滤器中的当前saltbefore_validation属性,所以验证应该是这样的,使用脏tracki:

unless BCrypt::Password.new(self.crypted_password_was) == (old_password + self.salt_was)
  errors.add(:old_password, 'is wrong')
end