2010-02-09 55 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 

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

相关问题