私のクライアントは、すべてのユーザーデータが暗号化望んでいるので、私はGibberish
を使用して特定のプロパティ暗号化するバックbefore_save
とafter_find
コール作成しました:before_saveを複数回実行するモデルを作成しますか?
# user.rb
before_save UserEncryptor.new
after_find UserEncryptor.new
# user_encryptor.rb
class UserEncryptor
def initialize
@cipher = Gibberish::AES.new("password")
end
def before_save(user)
user.first_name = encrypt(user.first_name)
user.last_name = encrypt(user.last_name)
user.email = encrypt(user.email) unless not user.confirmed? or user.unconfirmed_email
end
def after_find(user)
user.first_name = decrypt(user.first_name)
user.last_name = decrypt(user.last_name)
user.email = decrypt(user.email) unless not user.confirmed? or user.unconfirmed_email
end
private
def encrypt(value)
@cipher.enc(value)
end
def decrypt(value)
@cipher.dec(value)
end
end
まあ、Devise
を使用してユーザーが最初にサインアップし、モデルのルックスをそれはまさにそうすべきです。しかし、ユーザーが確認すると、ユーザーを調べると、first_name
とlast_name
のプロパティが複数回暗号化されているように見えます。そこで、私はbefore_save
メソッドにブレークポイントを置き、確認リンクをクリックすると、3回連続して実行されています。その結果、暗号化された値が再び暗号化され、再び暗号化され、次回にレコードを取得し、その後毎回暗号化された値が2回取得されます。
今、なぜこれが起こっているのですか?同じロジックを実行している他の非開発モデルでは発生しません。 Devise
にはcurrent_user
がいくつかの場所にキャッシュされていて、それぞれの場所にユーザーを保存していますか?他にどのようにbefore_save
コールバックが3回呼び出されてbefore_find
が実行されるのですか?
また、Devise
を使用しているときにユーザーデータを暗号化するにはどうすればよいですか。私もattr_encrypted
とdevise_aes_encryptable
の問題を抱えていましたので、私はそれらの提案をたくさん得た場合、私は投稿するためにさらに質問があると思います:-)