比較のためにパスワードを手動で暗号化しようとしています。これは私が呼び出す必要があるメソッドだと思いますが、Sorcery::Model.encrypt('password')
機能しませんか?
私は得続けますNoMethodError: undefined method encrypt for Sorcery::Model:Module
比較のためにパスワードを手動で暗号化しようとしています。これは私が呼び出す必要があるメソッドだと思いますが、Sorcery::Model.encrypt('password')
機能しませんか?
私は得続けますNoMethodError: undefined method encrypt for Sorcery::Model:Module
私はこれに対する解決策を得ました。
ソーサリーがデフォルト設定になっているとします。
ビュー内: (テンプレートにスリムを使用)
= 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
他の方法でパスワードを暗号化する場合は、マジック ラインを適切な方法に変更する必要があります。
たぶん役立つ。
前の質問に、検証をモデルに移動する方が良いということを追加したかったのです。そして、ちょっとした問題は、モデルを新しい属性password
と属性で初期化すると、フィルター内password_confirmation
の現在の属性と属性が更新crypted_password
されるため、ダーティ トラックを使用して検証を次のようにする必要があることです。salt
before_validation
unless BCrypt::Password.new(self.crypted_password_was) == (old_password + self.salt_was)
errors.add(:old_password, 'is wrong')
end