Ruby on Rail的Authlogic gem - 仅用于密码重置和编辑页面的密码确认

时间:2010-08-27 02:44:20

标签: ruby-on-rails passwords authlogic reset confirmation

我跟着Authlogic example tutorial at github并设置并运行了所有内容。但我想对密码确认进行更改。

遵循本教程,您必须在注册时输入密码确认。我不希望这是必要的,所以我将c.require_password_confirmation = false放在acts_as_authentic块中。但这完全取消了密码确认。我仍然希望在编辑用户页面上有密码确认,以便他们更改密码。我也想把它用于重置密码页面(我目前还没有设置)。

我该怎么做?

此外,虽然不那么重要,但在“编辑用户”页面上,所有内容当前都是一个表单,UsersController中有一个更新def。因此,如果有人想要更改其他信息,他们还必须输入他们当前的密码,因为我目前已将其设置为......

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.'  
      render :action => :edit  
    else  
      render :action => :edit  
    end  
  else  
    flash[:notice] = 'Your old password is wrong.'  
    render :action => :edit  
  end  
end

我最好喜欢这样,只要他们更改电子邮件地址或输入新密码,只需要输入旧密码。


user.rb


class User < ActiveRecord::Base
  acts_as_authentic do |c|
    c.require_password_confirmation = false
  end
attr_accessor :old_password, :reset_password validate :old_password_valid, :on => :update, :unless => [:reset_password]
def old_password_valid errors.add(:old_password, "You must introduce your password") unless valid_password?(old_password) end
def require_password? password_changed? || (crypted_password.blank? && !new_record?) || reset_password end
def deliver_password_reset_instructions! reset_perishable_token! Notifier.deliver_password_reset_instructions(self) end end

1 个答案:

答案 0 :(得分:0)

我会这样做,添加访问器old_password,reset_password(重置密码时设置为true的布尔值):

attr_accessor :old_password, :reset_password

现在,我们需要在更新时验证旧密码,但不能重置:

validate :old_password_valid, :unless => [:reset_password]

def old_password_valid
  errors.add(:old_password, "You must introduce your password") if !new_record? && !valid_password?(old_password)
end

到目前为止,我们已经验证了旧密码在用户更新其个人资料时有效。

现在,为了询问新密码,Authlogic添加了一个方法'require_password?'对于您的用户模型,您必须覆盖它。我这样做了:

def require_password?
  password_changed? || (crypted_password.blank? && !new_record?) || reset_password
end

基本上要求密码(和确认)时:1)用户更新密码,2)用户激活他们的帐户(所以他们仍然没有密码),3)用户重置密码。

希望这有帮助。