我对 ruby on rails 很陌生,所以我不确定如何实现它。我有一张表,里面有一个“password_hash”字段的条目。当用户创建新条目时,他们输入密码。我想(显然)将该密码的哈希值放在“password_hash”字段中。执行此操作的哈希命令在哪里?在模型中?
其次,当有人使用“销毁”方法删除条目时,我希望他们必须输入密码,并且只有在条目的哈希值与为该条目存储的哈希值匹配时才销毁条目。我猜这个在控制器中的destroy方法中,但我不知道如何进行检查。
我对 ruby on rails 很陌生,所以我不确定如何实现它。我有一张表,里面有一个“password_hash”字段的条目。当用户创建新条目时,他们输入密码。我想(显然)将该密码的哈希值放在“password_hash”字段中。执行此操作的哈希命令在哪里?在模型中?
其次,当有人使用“销毁”方法删除条目时,我希望他们必须输入密码,并且只有在条目的哈希值与为该条目存储的哈希值匹配时才销毁条目。我猜这个在控制器中的destroy方法中,但我不知道如何进行检查。
对于密码散列部分,请查看此 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
以下是做你想做的事情的要素。您可以在模型上创建一个 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