2012-05-04 13 views
16

私のアプリでは、管理者だけが新しいユーザーレコードを作成できます。ユーザーは、パスワードを設定するアクティベーションリンクに電子メールで送信されます。管理者は、検証が失敗したレコードが作成されますので、とき...has_secure_passwordバリデーションをスキップする方法

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

は素晴らしい作品が、それは自動的にパスワードの存在は、ダイジェスト検証:

私はhas_secure_passord法(railscast)を使用したいと思います。私は追加した他のものをスキップすることなく、自動的に追加されたpassword_digest検証をスキップする方法がありますか?

答えて

11

私は自分のカスタム認証を行うことを決めました。次のソリューションは、パスワードが設定されている場合にのみパスワードを検証します。これにより、管理者はパスワードを追加せずにユーザーを作成できます。

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メソッドを使用することができます答えを投稿した場合、私の代わりにそれを受け入れるだろう。

+2

こんにちは、このスニペットがソーシャル認証に必要なものを完璧に処理してくれたことを感謝します。 –

+0

感心、私はこの複数のログインをサポートするためにわずかなバリエーションを使用して、通常の電子メール/パスワードログインとパスワードなしFacebookの認証。ブース、私は言う! – FireDragon

1

妥当性検査をスキップする方法はありませんが、引数を渡してpassword_digestフィールドの存在を検証するかどうかを判断する独自のバージョンのメソッドを記述するのは簡単です。

SecurePassword moduleActiveSupport::Concern経由)と同じ方法でActiveModelを拡張し、独自の安全なパスワード方法を追加してください。

すなわち

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 
+0

。しかし、ちょっと間違っていると感じます。私はよりエレガントなものを見つけることを望んでいます。 – tybro0103

26

レールの4.Xバージョン以降、has_secure_passwordにはオプション:検証があります。 falseに設定すると、検証は実行されません。

3.Xバージョンのgemはこのパラメータをサポートしていません。ただし、この引数をサポートするlatest 4.0.XRC codeからactivemodel/lib/active_model/secure_password.rbをバックポートできます。

だからで、あなたのコードは次のようになります。仕事ができる

class User < ActiveRecord::Base 
    has_secure_password :validations => false 
    ... 
end 
関連する問題