2012-07-28 34 views
0

我對軌道上的ruby很新,所以我不確定如何實現這一點。我有一張桌子,裏面裝滿了「password_hash」字段。當用戶創建新條目時,他們輸入密碼。我想(顯然)在「password_hash」字段中輸入該密碼的散列。哈希命令去做這個去哪裏?在模型中?其次,當某人使用「銷燬」方法刪除一個條目時,我希望他們必須輸入密碼,並且只有在它的散列匹配爲該條目存儲的散列時才銷燬該條目。我猜這是一個在控制器中的銷燬方法,但我不知道如何執行檢查。散列密碼並要求刪除行爲

回答

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 
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