0

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

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

4

2 回答 2

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

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

也许有帮助。

于 2013-10-31T03:10:10.053 回答
0

我想在前面的问题中补充一点,将验证移到模型中会更好。有个小问题是,当你用 newpasswordpassword_confirmation属性初始化模型时,它会更新过滤器中的当前crypted_passwordsalt属性before_validation,所以验证应该是这样的,使用脏 tracki:

unless BCrypt::Password.new(self.crypted_password_was) == (old_password + self.salt_was)
  errors.add(:old_password, 'is wrong')
end
于 2014-07-08T06:06:32.857 回答