0

私はRuby on Railsにかなり慣れていないので、これを実装する方法がわかりません。「password_hash」フィールドを持つエントリでいっぱいのテーブルがあります。ユーザーが新しいエントリを作成するときは、パスワードを入力します。(明らかに)そのパスワードのハッシュを「password_hash」フィールドに入れたいです。これを行うハッシュコマンドはどこに行くのですか? モデルで?

第二に、誰かが「破棄」メソッドを使用してエントリを削除する場合、パスワードを入力する必要があり、エントリのハッシュがそのエントリに保存されているハッシュと一致する場合にのみエントリを破棄する必要があります。これはコントローラーの destroy メソッドに入ると思いますが、チェック方法がわかりません。

4

2 に答える 2

0

ここにあなたがやりたいことをするための要素があります。モデルに attr_accessor を作成し、パスワード ハッシュを自動的に生成してから、コントロールを使用して削除を確認できます。BCrypt ( http://bcrypt-ruby.rubyforge.org/ ) がハッシュを処理します。

あなたのモデル:

require 'bcrypt'

class Entry < ActiveRecord::Base
  include BCrypt

  def password
    @password ||= Password.new(password_hash)
  end

  def password=(new_password)
    @password = Password.create(new_password)
    self.password_hash = @password
  end
end

あなたのコントローラー:

class EntriesController < ApplicationController

...
  def destroy
    @entry = Entry.find(params[:id])
    if @entry.password == params[:password]
      @entry.destroy
    else
      redirect_to @entry, :notice => 'You must enter a valid password to destroy an entry'
    end
  end
end
  end

end
于 2012-07-29T04:12:06.233 に答える
0

パスワードハッシュ部分については、このスクリーンキャストhttp://railscasts.com/episodes/250-authentication-from-scratchをご覧ください。

同じスクリーンキャストで、ユーザーを認証する方法を確認できます。あなたの場合、パスワードを使用して認証したいだけです。

class SomeModelWithPassword < ActiveRecord::Base
  attr_accessible :password

  attr_accessor :password
  before_save :encrypt_password

  validates_presence_of :password, :on => :create


  def correct_password?(password_try)
    password_hash == BCrypt::Engine.hash_secret(password_try, password_salt)
  end

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end

破棄アクションでは、正しいパスワードかどうかを確認するだけです

def destroy
  @model = SomeModelWithPassword.find(params[:id])
  if @model.correct_password? params[:password]
    @model.destroy
  else
    ...
  end
end
于 2012-07-29T01:51:57.947 に答える