我的客戶希望所有的用戶數據進行加密的,所以我創建使用before_save
和after_find
回調,將加密某些屬性Gibberish
:當用戶第一次簽約使用Devise
,該模型看起來設計多次運行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
好,關於它應該。但是,一旦用戶確認,如果我檢查用戶,first_name
和last_name
屬性看起來已被多次加密。因此,我在before_save
方法中放置了一個斷點並單擊確認鏈接,我發現它已連續執行三次。結果是加密的值再次被加密,然後再次加密,所以下次我們檢索記錄時,每次都會得到兩次加密的值。
現在,爲什麼會發生這種情況?對於執行相同邏輯的其他非設計模型而言,這種情況不會發生。 Devise
是否將current_user
緩存在幾個不同的位置,並將用戶保存在每個位置?在執行下一個before_find
之前,還有什麼可以調用before_save
回調3次?
而且,更重要的是,當我使用Devise
時,如何成功加密我的用戶數據?我也遇到了attr_encrypted
和devise_aes_encryptable
問題,所以如果我收到很多這些建議,那麼我想我還有一些問題要發佈:-)