2010-02-09 84 views
5

我繼承了一個應用程序更新用戶的配置文件的以下行爲:如何在使用Authlogic時編寫和測試密碼更改?

class UsersController < ApplicationController 
    # ... 
    def update 
    @user = current_user 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "Successfully updated profile." 
     redirect_to root_url 
    else 
     flash[:error] = "Hrm, something went wrong." 
     render :action => 'edit' 
    end 
    end 
end 

的形式PUT S(真POST s的一個_method=PUT)到行動有passwordpassword_confirmation場,但沒有old_password場。我已經通過測試發現,我甚至不需要填寫password_confirmation字段。

第一個問題:在使用Authlogic時,是否有一種更爲確定的密碼更改方式?

第二個問題:有沒有關於密碼更改的最佳實踐(特別是從可用性的角度來看)的文獻?它應該是一個單獨的形式,不與其他用戶字段混合?

第三個問題:大多數網站都有old_password字段,但Authlogic似乎並不支持本地。 Authlogic-ey確認用戶自己改變密碼的方式是什麼,而不是那些黑客攻擊會話的人?

+0

我得到密碼更新的麻煩的原因是我在做{@user = Factory(:user),UserSession.create(@user )}在一個整體設置塊中,然後在內部設置塊中再次執行{@user = Factory(:user)}'並檢查該用戶的密碼更改,但實際上在外部更改該密碼。 D'哦! – 2010-02-10 17:17:14

回答

5

第一個答案:Authlogic爲您提供了框架,但實施取決於您。大多數網站只提供「更改密碼」頁面,該頁面僅顯示「密碼」和「密碼確認」字段或「編輯配置文件」頁面,允許您更新用戶記錄中要更改的字段。根據用戶記錄中有多少個字段,您可以選擇單獨的更改密碼頁面。你想要的表格很短。

至於password_confirmation沒有被要求:

  • 爲了進行測試,這取決於你如何嘲笑它或者你正在測試...是控制器/表格或者你正在測試的模型?
  • require_password_confirmation true? (這是默認)

第二個答案:你會發現很多可用性標準在那裏,但我只是用KISS去。從可用性的角度來看,大多數人都對自己的工作以及已建立的工作感到滿意 - 所以請檢查Google,Facebook和37signals。非常簡單的過程。如上所述,簡短表單是一個重要的可用性目標。

如果您正在談論安全要求,您最好的選擇是PCI Compliance [PDF],其中規定了傳輸和存儲財務記錄的幾條規則,儘管他們沒有提及用戶憑證。如果您使用與信用卡相同的規則帳戶,您將擁有非常安全的設置。由於PCI合規無法實現,銀行是另一個值得關注的資源,因爲糟糕的會話處理可能導致大量資金缺失。我的幾個銀行帳戶現在確認我的登錄和密碼更改,圖像和安全問題超出我的標準密碼。我也發現了several good articles covering that

這導致第三個問題...

第三個答案: @user.valid_password?("old pass")

像這樣:在AuthLogic,只需在您users_controller繼續進行更新與之前檢查用戶的「舊密碼」字段

添加attr_accessor :old_password給您的用戶模型

,改變你的用戶控制器:

def update 
    @user = current_user 
    if @user.valid_password?(params[:user][:old_password]) 
     if @user.update_attributes(params[:user].reject{|key, value| key == "old_password"}) 
     flash[:notice] = 'Successfully updated profile.' 
     redirect_back_or_default root_url 
     else 
     render :action => 'edit' 
     end 
    else 
     flash[:warning] = 'Your old password is WRONG! What is your malfunction!?!' 
     render :action => 'edit' 
    end 
    end 

(你可能想改變警告......)

相關問題