我继承的应用程序具有以下更新用户配置文件的操作:
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
)该操作有一个password
和password_confirmation
领域,但没有old_password
现场.我通过测试注意到我甚至不需要填写该password_confirmation
字段.
第一个问题:使用Authlogic时是否有更成熟的密码更改方式?
第二个问题:是否有关于密码更改的最佳实践(特别是从可用性角度)的文献?它应该是一个单独的表单,而不是与其他用户字段混合使用?
第三个问题:大多数网站都有一个old_password
字段,但Authlogic似乎不支持本地.什么是Authlogic-ey方式确认它实际上是用户他/她自己更改密码而不是那些黑客入侵会话的人?
第一个答案:Authlogic为您提供框架,但实现取决于您.大多数网站只提供"更改密码"页面,其中仅显示"密码"和"密码确认"字段或"编辑配置文件"页面,该页面允许您更新要在用户记录中更改的字段.根据用户记录中的字段数,您可以选择单独的更改密码页面.您希望表单简短.
至于不需要password_confirmation:
对于测试,它取决于您如何模拟它或您正在测试的内容......是您正在测试的控制器/表单还是模型?
require_password_confirmation是真的吗?(这是默认值)
第二个答案:你会发现很多可用性标准,但我只是和KISS一起去.从可用性的角度来看,大多数人都对正在运行的工作和已建立的工作感到满意 - 因此请查看Google,Facebook和37signals.很简单的过程.如上所述,简短形式是一个重要的可用性目标.
如果您正在谈论安全要求,最好的选择是PCI合规性 [PDF],其中规定了传输和存储财务记录的若干规则,尽管他们没有提及用户凭据.如果您将相同的规则应用于帐户,就像使用信用卡一样,您将拥有一个非常安全的设置.由于PCI合规性不足以实现,银行是另一个值得关注的重要资源,因为糟糕的会话处理可能导致大量的资金缺失.我的几个银行帐户现在通过高于我的标准密码的图像和安全问题确认我的登录名和密码更改.我发现了几篇很好的文章.
这导致了第三个问题......
第三个答案:在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
(您可能想要更改警告......)