0

ユーザー情報を更新する機会をユーザーに提供したいと考えています。とりあえず名前とメールだけ。ユーザーは、更新を承認するために現在のパスワードを入力する必要があります。いくつかの方法を試しましたが、次の問題に行き着きました。

ユーザー属性を更新する前に、「validate_password」メソッドを呼び出します。

users_controller.rb:

def update
@user = User.find(params[:id])


respond_to do |format|
  if validate_password(params[:password]) && @user.update_attributes(params[:user])
    format.html { redirect_to @user, notice: 'Account was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
end

終わり

application_controller.rb:

  def validate_password(pswd)
if current_user.password_hash == BCrypt::Engine.hash_secret(pswd, current_user.password_salt)
  true
else
  false
end

終わり

正しいパスワードが「pswd」であっても false を返します。何か不足していますか?正しいソルトがわかっている場合は、パスワード ハッシュを再作成できますか?

4

2 に答える 2

1

以下も使用できます。

validates_presence_of :password, :on => :create

これにより、更新時にパスワードの検証を回避できます。

于 2013-03-01T01:01:38.527 に答える
1

current_user.password_hashを使用して作成されたハッシュが含まれていると仮定するとBCrypt::Password#create

current_user.password_hash == BCrypt::Engine.hash_secret(...)

試す

BCrypt::Password.new(current_user.password_hash) == passwd

自分で塩漬けしないでください。BCrypt はすでにソルティングを行っているため、冗長です。

良い方向へのもう 1 つのステップは、手書きの認証を放棄し、実戦でテスト済みの既存のソリューション (例: Devise ) を使用することです。

于 2012-12-03T13:54:02.233 に答える