2

現在、ユーザー認証にGemDeviseを使用するように変更されています。しかし、暗号化を一致させる方法がわかりません!

新しい暗号化を記述して初期化子に割り当てることができることは知っていましたが、要点は、暗号化が4つの引数(パスワード、ストレッチ、ソルト、ペッパー)のみを受け入れることです。しかし、私の場合、暗号化にユーザーの電子メールとカスタマイズされたソルトを含めました。

ユーザーの電子メールとカスタマイズされたソルトを暗号化装置に渡すことは可能ですか?

ps。database_authenticatableを使用しています

4

2 に答える 2

9

誰も私の質問に答えてくれなかったのは悲しい......

しかし、想像したほどきれいではありませんが、答えを見つけたと思います。

まず、初期化子で暗号化クラスを作成します。

module Devise
  module Encryptors
    class MySha1 < Base
      def self.digest(password, salt)
        Digest::SHA1.hexdigest("#{salt}-----#{password}")
      end

      def self.salt(email)
        Digest::SHA1.hexdigest("#{Time.now}-----#{email}")
      end
    end
  end
end

次に、User モデルのいくつかのメソッドを上書きします。

# overwrite this method so that we call the encryptor class properly
def encrypt_password
  unless @password.blank?
    self.password_salt = self.class.encryptor_class.salt(email)
    self.encrypted_password = self.class.encryptor_class.digest(@password, self.password_salt)
  end
end

# Because when the database_authenticatable wrote the following method to regenerate the password, which in turn passed incorrect params to the encrypt_password, these overwrite is needed!
def password=(password)
  @password = password
end
def password_digest(pwd)
  self.class.encryptor_class.digest(pwd, self.password_salt)
end

そして最後に、いつパスワードを暗号化するかを教えなければなりません:

before_save :encrypt_password
于 2010-08-23T03:36:59.487 に答える
0

これがどれくらい古いかはわかりませんが、これはより適切にサポートされている方法のようです: http://presentations.royvandewater.com/authentication-with-devise.html#9

于 2012-02-27T21:54:09.920 に答える