0

比較のためにパスワードを手動で暗号化しようとしています。これは私が呼び出す必要があるメソッドだと思いますが、Sorcery::Model.encrypt('password')機能しませんか?

私は得続けますNoMethodError: undefined method encrypt for Sorcery::Model:Module

4

2 に答える 2

2

私はこれに対する解決策を得ました。

ソーサリーがデフォルト設定になっているとします。

ビュー内: (テンプレートにスリムを使用)

= 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

前の質問に、検証をモデルに移動する方が良いということを追加したかったのです。そして、ちょっとした問題は、モデルを新しい属性passwordと属性で初期化すると、フィルター内password_confirmationの現在の属性と属性が更新crypted_passwordされるため、ダーティ トラックを使用して検証を次のようにする必要があることです。saltbefore_validation

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 に答える