Yigit C. Bacakoglu Yazılım Mühendisi | Rubyist | Mekanist on Rails

  29/12/2013 at 09:54       by yigit     under ,

Merhaba arkadaşlar,

Veritabanında encrypted veri tutmak için yaptığım modulü sizlerle paylaşacağım. Objemizin istediğimiz attributelerini encrypted tutmak için onun getter ve setter methodlarını generic bir şekilde override ediyorum.

require 'active_record'

module MessageEncryptor
  @@crypt
  extend self

  def encrypt(val)
    crypt.encrypt_and_sign(val) rescue val
  end

  def decrypt(val)
    crypt.decrypt_and_verify(val) rescue val
  end

  def crypt
    @@crypt ||= ActiveSupport::MessageEncryptor.new(Rails.application.config.secret_token)
  end

end


module MessageEncryptorClassMethods

  def encrypt(*attr_names)
    options = attr_names.extract_options!
    attr_names = attr_names.map(&:to_sym)
    attr_names.each do |attr|
      define_method("#{attr}=") do |val|
        write_attribute(attr, MessageEncryptor.encrypt(val))
      end
      define_method("#{attr}") do
        MessageEncryptor.decrypt(read_attribute(attr))
      end
    end
  end

end

ActiveRecord::Base.extend(MessageEncryptorClassMethods)

ve modelimize şu satırı ekleyin:

#user.rb
# token :string
# secret_token :string
# email :string

encrypt :token, :secret_token #encrypted olmasını istediğimiz attributeler
Comment Rails uygulamalarında veritabanında encrypted data tutmak - Encrypted / Decrypted Attributes