Mein Kunde will, dass alle Benutzerdaten verschlüsselt, also habe ich eine before_save
und after_find
Rückruf erstellt, die bestimmte Eigenschaften mit Hilfe Gibberish
verschlüsseln: Erste Anzeichen up mit Devise
, das Modell siehtDevise Modelle laufen vor_Speichern mehrmals?
# 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
Nun, wenn der Benutzer ungefähr wie es sollte. Aber sobald der Benutzer bestätigt, wenn ich den Benutzer inspiziere, scheinen die first_name
und last_name
Eigenschaften mehrfach verschlüsselt worden zu sein. Also setze ich einen Breakpoint in die before_save
Methode und klicke auf den Bestätigungslink, und ich sehe, dass es dreimal hintereinander ausgeführt wird. Das Ergebnis ist, dass der verschlüsselte Wert erneut verschlüsselt wird und dann erneut, so dass beim nächsten Abruf des Datensatzes und jedes Mal danach ein zweifach verschlüsselter Wert erhalten wird.
Nun, warum zum Teufel ist das passiert? Es tritt nicht bei anderen Nicht-Modell-Modellen auf, die dieselbe Logik ausführen. Hat Devise
die current_user
im Cache an ein paar verschiedenen Orten, und es speichert den Benutzer an jedem Ort? Wie sonst könnte ein Callback before_save
3 Mal aufgerufen werden, bevor das nächste before_find
ausgeführt wird?
Und noch wichtiger, wie kann ich meine Benutzerdaten erfolgreich verschlüsseln, wenn ich Devise
verwende? Ich habe auch Probleme mit attr_encrypted
und devise_aes_encryptable
, also wenn ich viele dieser Vorschläge dann habe, schätze ich, habe ich noch einige Fragen zu posten :-)