Rails 如何让一个 AR 用起来像是另一种 Obj?

ruohanc · 2014年01月02日 · 最后由 ruohanc 回复于 2014年01月03日 · 2246 次阅读

具体场景比如我希望做一个自签名的 CA,那么 CA Certificate 我希望可以序列化后保存在数据库里。然后每次取出这个 model 的时候就像拿出了一个 CA (OpenSSL::X509::Certificate.new raw_pem_string),并且这个对象也继承了 OpenSSL::X509::Certificate 的所有方法

class CACertificate < ActiveRecord::Base

  def initialize
    @obj = OpenSSL::X509::Certificate.new self.raw
  end

  def subject # method from OpenSSL::X509::Certificate
    @obj.subject
  end

  def save
    @obj.to_pem
  end
end

CACertificate.find(1).subject

我其实还有另一种需求,就是把一个 AR 里面的一个属性当作一个对象来处理,当然保存的时候再用序列化的方式保存,下次取出的时候反序列化即可,比如 IP

class Server < ActiveRecord::Base
  def ip
    @ip ||= IPAddress.new read_attribute(:ip) # 类似这样,但我不知道怎么序列化存进数据库
  end
end

update:

把 AR 的属性当作对象来处理解决了,有两个方案:

自己序列化和反序列化

class Server < ActiveRecord::Base
  def ip=(ip)
    write_attribute(:ip, ip.to_s).tap { @ip = nil }
  end

  def ip
    @ip ||= IPAddr.new read_attribute(:ip)
  end
end

用 rails 提供的直接的序列化方案

class Server < ActiveRecord::Base
  serialize :ip, IPAddress
end

都自签名了还存数据库里干嘛 ...

#1 楼 @bhuztez 自签名 CA,再用自签名的 CA 签发证书。加密内网流量

而且每个证书也需要保存在数据库里面。

#2 楼 @ruohanc CA 不就是为了不要保存证书啊 ... 拙计啊

#3 楼 @bhuztez CA 的问题你有兴趣可以另开贴讨论,我先想解决一下 Rails 的问题。

目测 OpenSSL::X509::Certificate 无法 include,于是我只能像 active_record/base 一样 extend 和 include 所有 module 么?

好吧,测试失败,我还是另开一个 Service 层来处理签名问题吧,然后 Cert 什么的就按照 PEM 的方式存数据库完事了

第一个可以用 delegate

class CACertificate < ActiveRecord::Base
  attr_accessor :cert
  delegate :subject, :xxx, :to => :cert

  after_find do |record|
    self.cert = OpenSSL::X509::Certificate.new record.raw
  end
end

#4 楼 @ruohanc 发证书的问题我 n 年前就解决了 ...

#8 楼 @bhuztez - -... 那请教一下 ” CA 是为了不要保存证书 “ 是应该咋整。?

我希望 SSL 请求都能被 Verify,所以才用统一的 CA 去签

#9 楼 @ruohanc 你这种纯瞎搞我都不知道从哪里说起了 ...

#10 楼 @bhuztez openssl 自签名证书供 nginx SSL 使用 我是参考这个模式做的,先自签 CA,再用 CA 签发证书。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号