在Authlogic中强制验证空白密码

时间:2010-02-01 00:51:59

标签: ruby-on-rails authlogic reset-password

我正在为使用Authlogic的Rails应用程序添加密码重置功能。我在这里遵循指南:http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/除了一件事之外,一切都按照我的意愿运行:密码重置表单接受空白密码并且不会更改它们。

我一直在搜索,并且已经了解到这是预期的默认行为,因为它允许您创建用户编辑表单,只有在用户输入新密码时才更改用户密码,否则忽略它。但在这种情况下,我特别希望强制验证密码,就像用户最初注册时一样。我已经为这个问题找到了两种可能的解决方案,但是却无法弄清楚如何实现这两种方法。

1)有人在Google网上论坛上提出同样的问题:

User model saves with blank password

Ben的回答是使用@user.validate_password = true来强制验证密码。我尝试了这个但是我得到了一个未定义的方法错误:undefined method 'validate_password_field=' for #<User>

2)似乎有一个名为ignore_blank_passwords的Authlogic配置选项。这里记录在案:

Module: Authlogic::ActsAsAuthentic::Password::Config#ignore_blank_passwords

这看起来可行,但我的理解是这是一个全局配置选项,您在User模型的初始acts_as_authentic调用中使用,我不想在应用程序范围内更改它,因为我有一个常规的编辑表单,我希望默认情况下可以忽略空白密码。

有人找到了解决方法吗?我在Authlogic 1.4.1的更改日志中看到validate_password=,从那时起它就一直没有被删除。我只是错误地使用它吗?有没有办法在每个请求的基础上使用ignore_blank_passwords

5 个答案:

答案 0 :(得分:8)

这是一个旧线程,但由于没有答案,我会发布这个。

我设法比其他解决方案做得更干净,“帮助”验证我自己的验证。

我将此添加到用户:

class User < ActiveRecord::Base

  ...

  attr_writer :password_required

  validates_presence_of :password, :if => :password_required?

  def password_required?
    @password_required
  end

  ...
end

您可以通过制作attr_accessor并使用:if => :password_required(无审讯)将其缩减为两行,但我更喜欢使用询问符号的其他语法。

然后您的控制器操作可以这样完成:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  @user.password_required = true

  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

这将产生局部效应;应用程序的其余部分不会受到影响(除非password_required在其他地方设置为true,即)。

我希望它有所帮助。

答案 1 :(得分:5)

这就是我所做的。

class User < ActiveRecord::Base
  attr_accessor :ignore_blank_passwords

  # object level attribute overrides the config level
  # attribute
  def ignore_blank_passwords?
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
  end
end

现在在您的控制器中,将ignore_blank_passwords属性设置为false。

user.ignore_blank_passwords = false

在这里,您正在AuthLogic的范围内工作。您不必更改验证逻辑。

答案 2 :(得分:2)

User.ignore_blank_passwords = false

使用model而不是object来设置此属性。

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end

答案 3 :(得分:1)

也许测试控制器中参数的值? (航空代码):

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  if @user.password.blank?
    flash[:error] = "Password cannot be blank"
    render :action => :edit
    return
  end
  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

答案 4 :(得分:1)

除了zetetic的解决方案,你可以这样做:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]

  if @user.changed? && @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

您基本上检查authlogic是否更改了用户记录(如果密码为空则不会更改)。在else块中,您可以检查密码是否为空,并向用户记录添加相应的错误消息或显示Flash消息。