22

私のアプリでは、管理者のみが新しいユーザー レコードを作成できます。ユーザーには、パスワードを設定するアクティベーション リンクが電子メールで送信されます。

has_secure_passord メソッド ( railscast )を使用したい:

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

うまく機能しますが、パスワードダイジェストの存在を自動的に検証します...そのため、管理者がレコードを作成すると、検証が失敗します。追加した他の検証をスキップせずに、自動的に追加された password_digest 検証だけをスキップする方法はありますか?

4

4 に答える 4

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

すなわち

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 に答える