我正在尝试手动加密密码以进行比较。我认为这是我需要调用的方法,但Sorcery::Model.encrypt('password')
不起作用?
我不断得到NoMethodError: undefined method encrypt for Sorcery::Model:Module
我正在尝试手动加密密码以进行比较。我认为这是我需要调用的方法,但Sorcery::Model.encrypt('password')
不起作用?
我不断得到NoMethodError: undefined method encrypt for Sorcery::Model:Module
我有一个解决方案。
假设巫术在默认设置下。
在视图中:(我用 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
如果您使用其他方法来加密密码,则需要更改魔术线以获得正确的方法。
也许有帮助。
我想在前面的问题中补充一点,将验证移到模型中会更好。有个小问题是,当你用 newpassword
和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