我正在尝试手动加密密码以进行比较。
我认为this是我需要调用的方法,
但Sorcery::Model.encrypt('password')
不起作用?
我不断获得NoMethodError: undefined method encrypt for Sorcery::Model:Module
答案 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)
我想在上一个问题中添加更好的方法来将验证移到模型中。
还有一点是,当您使用新的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