帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:模式  URI  IDE  Identify  ident  
Identify app models with a URI

  • 源代码名称:globalid
  • 源代码网址:http://www.github.com/rails/globalid
  • globalid源代码文档
  • globalid源代码下载
  • Git URL:
    git://www.github.com/rails/globalid.git
  • Git Clone代码到本地:
    git clone http://www.github.com/rails/globalid
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/rails/globalid
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • 全局标识- 通过URI引用模型

    全局标识是唯一标识模型实例的应用程序宽 URI:

    gid://YourApp/Some::Model/id

    当需要一个标识符来引用不同的对象类时,这很有用。

    一个例子是作业调度。 我们需要引用一个模型对象而不是序列化对象本身。 我们可以传递一个全局,它可以用于在执行该作业时定位模型。 作业调度程序不需要知道模型命名和id的细节,因为它具有引用模型的全局标识符。

    另一个例子是下拉列表,包括用户和组。 通常我们需要提出自己的特殊方案来引用它们。 对于全局 id,我们有一个通用标识符,它适用于两个类的对象。

    用法

    GlobalID::Identification 混合到任何具有 #find(id) 类方法的模型中。 支持自动包含在 Active Record 中。

    person_gid =Person.find(1).to_global_id# => #<GlobalID.. .person_gid.uri# => #<URI.. .person_gid.to_s# =>"gid://app/Person/1"GlobalID::Locator.locate person_gid# => #<Person:0x007fae94bf6298 @id="1">

    签名的全局 id

    为了增加安全性,还可以签名GlobalIDs以确保数据没有被篡改。

    person_sgid =Person.find(1).to_signed_global_id# => #<SignedGlobalID:0x007fea1944b410>person_sgid =Person.find(1).to_sgid# => #<SignedGlobalID:0x007fea1944b410>person_sgid.to_s# =>"BAhJIh5naWQ6Ly9pZGluYWlkaS9Vc2VyLzM5NTk5BjoGRVQ=--81d7358dd5ee2ca33189bb404592df5e8d11420e"GlobalID::Locator.locate_signed person_sgid# => #<Person:0x007fae94bf6298 @id="1">

    到期时间

    签名的全局id在将来可能会过期一段时间。 如果有一个资源人员不应该有不确定的访问权,就像共享链接一样有用。

    expiring_sgid =Document.find(5).to_sgid(expires_in:2.hours, for:'sharing')# => #<SignedGlobalID:0x008fde45df8937.. .># Within 2 hours...GlobalID::Locator.locate_signed(expiring_sgid.to_s, for:'sharing')# => #<Document:0x007fae94bf6298 @id="5"># More than 2 hours later...GlobalID::Locator.locate_signed(expiring_sgid.to_s, for:'sharing')# => nil

    Rails 中的,缺省情况下设置 1个月的自动过期。 ,你可以在一个带有以下参数的初始值设定项中更改该事务:

    # config/initializers/global_id.rbRails.application.config.global_id.expires_in =3.months

    你可以像这样分配默认的SGID生命周期:

    SignedGlobalID.expires_in =1.month

    这种方式任何生成的SGID将使用相对到期。

    值得注意的是,过期不是幂等的,因为它们编码当前时间戳;反复调用 to_sgid 会产生不同的结果。 例如在 Rails 中

    Document.find(5).to_sgid.to_s ==Document.find(5).to_sgid.to_s# => false

    你需要明确传递 expires_in: nil 来生成一个不会过期的永久 SGID。

    # Passing a false value to either expiry option turns off expiration entirely.never_expiring_sgid =Document.find(5).to_sgid(expires_in:nil)# => #<SignedGlobalID:0x008fde45df8937.. .># Any time later...GlobalID::Locator.locate_signed never_expiring_sgid# => #<Document:0x007fae94bf6298 @id="5">

    还可以通过特定的到期时间

    explicit_expiring_sgid =SecretAgentMessage.find(5).to_sgid(expires_at:Time.now.advance(hours:1))# => #<SignedGlobalID:0x008fde45df8937.. .># 1 hour later...GlobalID::Locator.locate_signed explicit_expiring_sgid.to_s# => nil

    请注意,显式 :expires_at 优先于相对 :expires_in

    目的

    你甚至可以通过解释签署的全局标识的用途来进一步提高安全性。 这样evildoers就不能在登录页面上重用表单的SGID。 例如。

    signup_person_sgid =Person.find(1).to_sgid(for:'signup_form')# => #<SignedGlobalID:0x007fea1984b520GlobalID::Locator.locate_signed(signup_person_sgid.to_s, for:'signup_form')# => #<Person:0x007fae94bf6298 @id="1">

    自定义应用程序定位器

    通过调用 GlobalID::Locator.use 并为应用程序提供应用定位器,可以为应用程序设置定制定位器。 当不同应用程序协作并引用彼此的global IDs时,定制应用程序定位器很有用。 在查找全局模型时,要使用的定位器基于全局 in url提供的应用程序名称。

    自定义定位器可以是块,也可以是类。

    使用块:

    GlobalID::Locator.use :foodo |gid|
     FooRemote.const_get(gid.model_name).find(gid.model_id)end

    使用类:

    GlobalID::Locator.use :bar, BarLocator.newclassBarLocatordeflocate(gid)
     @search_client.search name: gid.model_name, id: gid.model_id
     endend

    像上面这样定义定位器之后,"gid://foo/Person/1" 和"gid://bar/Person/1" 之类的uri现在将分别使用块定位器和 BarLocator。 其他应用程序仍将继续使用默认定位器。

    提供 GlobalID

    GlobalID是许多贡献者的工作。 建议你提交请求请求,建议特性并讨论问题。

    请参见捐赠。

    许可证

    GlobalID是在 MIT许可协议下发布的。



    文章标签:模式  IDE  ident  Identify  URI  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语