如何跳过has_secure_password验证

tyb*_*103 19 ruby validation ruby-on-rails ruby-on-rails-3

在我的应用程序中,只有管理员可以创建新的用户记录.用户通过电子邮件发送激活链接,在其中设置密码.

我想使用has_secure_passord方法(railscast):

class User < ActiveRecord::Base
  has_secure_password
  ...
end
Run Code Online (Sandbox Code Playgroud)

效果很好,但它会自动验证密码摘要的存在...所以当管理员创建记录时,验证失败.我有办法跳过自动添加的password_digest验证而不跳过我添加的其他人吗?

jou*_*yer 30

从4.X版本的rails开始,has_secure_password选择:验证.如果将其设置为false,则不会运行验证.

3.X版本的gem不支持此参数.但是,您可以从支持此参数的最新4.0.XRC代码向后端移动activemodel/lib/active_model/secure_password.rb .

因此,您的代码将如下所示:

class User < ActiveRecord::Base
  has_secure_password :validations => false
  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 是否可以以可选方式使用“:validations”?我的意思是,如果有密码值,它应该验证,否则,它会跳过。 (3认同)

tyb*_*103 12

我决定做自己的自定义身份验证.以下解决方案将验证密码,但仅在设置密码时验证密码.这允许管理员在不添加密码的情况下创建用户.

class User < ActiveRecord::Base
  include BCrypt

  attr_accessor :password, :password_confirmation

  validates :password, length: (6..32), confirmation: true, if: :setting_password?

  def password=(password)
    @password = password
    self.password_hash = Password.create(password)
  end

  def authenticate(password)
    password.present? && password_hash.present? && Password.new(password_hash) == password
  end

private

  def setting_password?
    password || password_confirmation
  end

end
Run Code Online (Sandbox Code Playgroud)

如果有人发布了允许我仍然使用该has_secure_password方法的答案,我会接受它.

  • 嘿,只是想说谢谢这个片段完美地适用于我需要的社交认证 (2认同)