5

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

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

1) 有人在 Google Groups 上问过同样的问题:

用户模型使用空白密码保存

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

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

模块:Authlogic::ActsAsAuthentic::Password::Config#ignore_blank_passwords

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

有人找到解决方案吗?我validate_password=在 Authlogic 1.4.1 的更改日志中看到,从那时起就没有任何关于它的内容被删除。我只是不正确地使用它吗?有没有办法ignore_blank_passwords在每个请求的基础上使用?

4

5 回答 5

8

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

我已经设法比其他解决方案更干净一些,用我自己的“帮助” authlogic 验证。

我将此添加给用户:

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,即)。

我希望它有所帮助。

于 2010-04-26T14:48:15.993 回答
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 的范围内工作。您不必更改验证逻辑。

于 2010-09-13T19:34:37.523 回答
2
User.ignore_blank_passwords = false

使用模型,而不是对象来设置此属性。

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end
于 2010-07-02T05:43:31.267 回答
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
于 2010-02-01T04:49:22.447 回答
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 块中,您可以检查密码是否为空,并在用户记录中添加适当的错误消息或显示闪烁消息。

于 2010-03-04T17:28:37.213 回答