我的模型中有一个 before_save 回调,它在将 2 个字段保存到数据库之前对其进行加密。
class Account < ActiveRecord::Base
before_save :encrypt_credentials, if: "!username.blank? && !password.blank?"
def encrypt_credentials
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
self.username = crypt.encrypt_and_sign(username)
self.password = crypt.encrypt_and_sign(password)
end
def decrypted_username
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
crypt.decrypt_and_verify(username)
end
def decrypted_password
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
crypt.decrypt_and_verify(password)
end
end
这种情况非常类似于多次运行before_save的Devise模型?. 当我调用 Model.create!(...) - 其中包括需要加密的 2 个字段时, before_save 被调用两次,最终在被加密的字段中结束。
Account.create!(
{
username: ENV['USERNAME'],
password: ENV['PASSWORD']
})
为什么 before_save 被多次调用?我不喜欢上面链接的帖子的解决方案,我不想先新建/构建然后保存。
这是用户错误:( 在调用 account = Account.create! 之后,我有其他代码调用了 save! 回到模型上:account.foo = bar; account.save!。这显然再次调用 befor_save 并重新加密了我的字段. 我最终得到了这样的结果:
class Account < ActiveRecord::Base
before_save :encrypt_username, if: :username_changed?
before_save :encrypt_password, if: :password_changed?
def encrypt_username
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
self.username = crypt.encrypt_and_sign(username)
end
def encrypt_password
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
self.password = crypt.encrypt_and_sign(password)
end
def decrypted_username
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
crypt.decrypt_and_verify(username)
end
def decrypted_password
crypt = ActiveSupport::MessageEncryptor.new(ENV['KEY'])
crypt.decrypt_and_verify(password)
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句