使用Authlogic时如何编写和测试密码更改?

时间:2010-02-09 18:40:12

标签: ruby-on-rails ruby testing 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字段,但没有{{ 1}}字段。我通过测试注意到我甚至不必填写old_password字段。

第一个问题:使用Authlogic时是否有更成熟的密码更改方式?

第二个问题:是否有关于密码更改的最佳实践(特别是从可用性角度)的文献?它应该是一个单独的表单,而不是与其他用户字段混合使用吗?

第三个问题:大多数网站都有一个password_confirmation字段,但Authlogic似乎并不支持这种字段。什么是Authlogic-ey确认实际上是用户他/她自己更改密码的方式而不是那些已经破解了会话的人?

1 个答案:

答案 0 :(得分:5)

第一个答案:Authlogic为您提供了框架,但实现取决于您。大多数网站只提供“更改密码”页面,该页面仅显示“密码”和“密码确认”字段或“编辑配置文件”页面,允许您更新要在用户记录中更改的字段。根据用户记录中的字段数,您可以选择单独的更改密码页面。您希望表单简短。

至于不需要password_confirmation:

  • 进行测试,取决于您如何模拟它或您正在测试的内容......是您正在测试的控制器/表格还是模型?
  • require_password_confirmation true? (这是默认值)

第二个答案:你会发现很多可用性标准,但我只是和KISS一起去。从可用性的角度来看,大多数人都对正在运行的工作和已建立的工作感到满意 - 因此请查看Google,Facebook和37signals。很简单的过程。如上所述,简短形式是一个重要的可用性目标。

如果您正在谈论安全要求,最好的选择是PCI Compliance [PDF],其中列出了传输和存储财务记录的若干规则,尽管他们没有提及用户凭据。如果您将相同的规则应用于帐户,就像使用信用卡一样,您将拥有一个非常安全的设置。由于PCI合规性不足以实现,银行是另一个值得关注的重要资源,因为糟糕的会话处理可能导致大量的资金缺失。我的几个银行帐户现在通过高于我的标准密码的图像和安全问题确认我的登录名和密码更改。我也找到了several good articles covering that

这导致第三个问题......

第三个答案:在AuthLogic中,只需检查用户的“旧密码”字段,然后再继续在users_controller中进行更新: @user.valid_password?("old pass")

像这样:

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

(您可能想要更改警告......)