哈希密码并要求删除操作

时间:2012-07-28 23:48:14

标签: ruby-on-rails ruby

我对rails上的ruby很新,所以我不确定如何实现它。我有一个表格,其中包含一个带有“password_hash”字段的条目。当用户创建新条目时,他们输入密码。我想(显然)在“password_hash”字段中输入该密码的哈希值。 hash命令在哪里去做?在模型中?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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