【问题标题】:How do I write and test password changes when using Authlogic?使用 Authlogic 时如何编写和测试密码更改?
【发布时间】:2010-02-09 18:40:12
【问题描述】:

我继承的应用程序具有以下更新用户个人资料的操作:

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

PUTs(实际上是POSTs 与_method=PUT)对该操作的表单具有passwordpassword_confirmation 字段,但没有old_password 字段。我通过测试注意到,我什至不必填写password_confirmation 字段。

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

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

第三个问题:大多数网站都有一个old_password 字段,但 Authlogic 似乎本身并不支持该字段。什么是 Authlogic-ey 方式来确认实际上是用户他/她自己更改了密码,而不是有人入侵了他们的会话?

【问题讨论】:

  • 我无法更新密码的原因是我在整体设置块中执行{ @user = Factory(:user), UserSession.create(@user) },然后在内部设置块中再次执行{ @user = Factory(:user) }并检查密码更改该用户,但实际上在外部更改它。哦!

标签: ruby-on-rails ruby testing authlogic


【解决方案1】:

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

至于不需要密码确认:

  • 对于测试,这取决于您如何模拟它或您正在测试什么...是控制器/表单还是您正在测试的模型?
  • 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

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

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多