0

我对 ruby​​ on rails 很陌生,所以我不确定如何实现它。我有一张表,里面有一个“password_hash”字段的条目。当用户创建新条目时,他们输入密码。我想(显然)将该密码的哈希值放在“password_hash”字段中。执行此操作的哈希命令在哪里?在模型中?

其次,当有人使用“销毁”方法删除条目时,我希望他们必须输入密码,并且只有在条目的哈希值与为该条目存储的哈希值匹配时才销毁条目。我猜这个在控制器中的destroy方法中,但我不知道如何进行检查。

4

2 回答 2

0

对于密码散列部分,请查看此 sreencast 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 回答
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 回答