2010-01-06 75 views
0

我有問題的理解應用程序邏輯到這個密碼重置代碼,我發現下面的網絡。RAILS - 不理解密碼重置代碼

  1. 用戶收到一封帶有 鏈接的電子郵件,其中包含一些重置代碼。
  2. 點擊之後,他們去 以下稱爲動作復位
  3. 用戶在數據庫中發現 引用重置密碼。
  4. 改變密碼的形式示出 並且用戶在進入新密碼 。

赫雷什其中i混淆。

  1. 當表單提交後,再次調用該操作。
  2. 這次在params中將沒有重置代碼,所以沒有用戶將被發現@user = nil
  3. 這次它發佈了一個請求,所以我們輸入了這部分邏輯。

我的問題是 - 如何可以將此代碼永遠是有效的,如果@user =零if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])

# app/controllers/users_controller.rb 

def reset 
    @user = User.find_by_reset_code(params[:reset_code]) unless params[:reset_code].nil? 
    if request.post? 
    if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation]) 
     self.current_user = @user 
     @user.delete_reset_code 
     flash[:notice] = "Password reset successfully for #{@user.email}" 
     redirect_to root_url 
    else 
     render :action => :reset 
    end 
    end 
end 

<!-- app/views/users/reset.html.erb --> 

<%= error_messages_for :user %> 

<% form_for :user do |f| -%> 
    <p> 
    Pick a new password for <span><%= @user.email %></span> 
    </p> 

    <p> 
    <label for="password">Password</label><br /> 
    <%= f.password_field :password %> 
    </p> 

    <p> 
    <label for="password">Confirm Password</label><br /> 
    <%= f.password_field :password_confirmation %> 
    </p> 

    <p> 
    <%= submit_tag 'Reset' %> 
    </p> 
<% end -%> 

回答

1

我的答案是,它是越野車代碼。

首先,reset_code應通過窗體上的一個隱藏字段,或URL中的參數傳遞迴控制器。

其次,如果沒有reset_code在傳遞(如圖所示),@user將是零,你會得到一個AV。你需要添加代碼周圍的保護條款:

if [email protected] 
    flash.now[:notice] = "User not found." 
elsif request.post? 
    ... 

而且,如果它不是在代碼中已經包含你需要到期復位代碼的一些方法。在我的系統上,他們在五天後到期。您需要爲用戶表添加一個額外的字段。將代碼的發送日期存儲在那裏,幷包含另一個在給定時間範圍內的警衛子句。

(記住,只是因爲你發現它的淨並不意味着它是正確的和錯誤免費)。

1

如何驗證碼永遠如果@user有效=無

重置代碼不是您按照方式粘貼的視圖,而是使用相同的reset_code查找用戶...如果未找到,則用戶爲零。如果重置代碼存在,它不會是零,但是爲true並返回記錄。

+0

感謝您對錯誤的代碼,我糾正它。那麼表單提交回重置操作後會發生什麼。 @user將是零。但是在request.post中使用?阻止更新用戶。我不知道如何更新用戶? – robodisco 2010-01-06 04:58:12

1

我想你誤解了邏輯流程。您提供的視圖用於請求密碼重置電子郵件。該電子郵件可能會包含重置的URL,其中將包含reset_code參數。檢查reset.html視圖以確保在那裏處理reset_code參數。

+0

對不起,我添加了錯誤的觀點,但我現在重新編輯它。提交此表單後,應默認回到重置操作。但是這次在參數中沒有reset_code,所以我仍然不知道@ user.update_attributes是如何工作的。 – robodisco 2010-01-06 04:54:26

1

當表單提交時,再次調用動作 。

request.post? if語句檢查他們是否提交表單。其中的東西只有在表單提交POST請求時纔會執行,如果不是,它會像您看到的那樣呈現頁面。

這一次將在PARAMS沒有復位代碼,所以沒有用戶會發現@user =零

該頁面未呈現,因此用戶不設置任何東西都會好的,它將重定向回主要的url,這將使用戶基於會話或cookie,而不是重置代碼。

這次它發佈了一個請求,所以我們輸入了這部分邏輯。

雖然我無法弄清楚如何@user.update_attributes工作,因爲像你說的有結尾的那段unless聲明。

+0

確切的說,它會如何更新?我更新了帖子,以顯示正確的重置方式。不知道有什麼改變什麼。 – robodisco 2010-01-06 04:56:25