我对rails上的ruby很新,所以我不确定如何实现它。我有一个表格,其中包含一个带有“password_hash”字段的条目。当用户创建新条目时,他们输入密码。我想(显然)在“password_hash”字段中输入该密码的哈希值。 hash命令在哪里去做?在模型中?
其次,当有人使用“destroy”方法删除条目时,我希望他们必须输入密码,并且只有当条目的哈希值与为该条目存储的哈希值匹配时才销毁该条目。我猜这个在控制器中的destroy方法中,但我不知道如何进行检查。
答案 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