22

在我的应用中,只有管理员可以创建新的用户记录。用户会收到一个激活链接,他们在其中设置了密码。

我想使用 has_secure_passord 方法(railscast):

class User < ActiveRecord::Base
  has_secure_password
  ...
end

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

4

4 回答 4

31

从 4.X 版本的 rails 开始,has_secure_password有一个选项 :validations。如果将其设置为false,它将不会运行验证。

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

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

class User < ActiveRecord::Base
  has_secure_password :validations => false
  ...
end
于 2013-05-23T05:10:03.093 回答
14

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

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

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

于 2012-05-04T14:24:50.480 回答
1

没有办法跳过验证,但是编写自己的方法版本很容易,它允许您传递参数以确定是否验证 password_digest 字段的存在。

只需以与SecurePassword 模块ActiveModel中相同的方式进行扩展(通过)并添加您自己的安全密码方法。ActiveSupport::Concern

IE

module ActiveModel
  module MySecurePassword
    extend ActiveSupport::Concern

    module ClassMethods
      def my_has_secure_password(validate_password_digest=true)
        # you custom logic
      end
    end
  end
end
于 2012-05-04T04:07:18.617 回答
0

借鉴 Journeyer 和 Tybro 的答案,我想看看您是否可以添加一个私有方法,该方法返回 true 或 false 到验证哈希。它有效,我将它用于不同的用例,但在这种情况下,它看起来像这样。


  class User < ActiveRecord::Base
    has_secure_password validations: !:setting_password

   #If setting_password is true then this will be the same as 
   validations: false
   ..... 
   private

   def setting_password?
    #Some logic that determines if a user is setting a password and resolves 
    to true or false
    password || password_confirmation
   end
   ...
  end

于 2021-09-15T18:13:48.203 回答