【问题标题】:Protected sharing link in Ruby on Rails [closed]Ruby on Rails 中受保护的共享链接 [关闭]
【发布时间】:2014-08-05 07:47:38
【问题描述】:

我正在寻找一种方法来创建和共享到 Rails 视图的受保护链接。

在我的应用程序中,用户可以创建项目页面。我想让用户创建共享链接,以便只有具有链接的收件人才能访问项目页面并将 cmets 留在该页面上。我什至可能想为链接添加密码保护。

这有什么宝石吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我不知道任何受保护链接的宝石,我可以想象很难找到这样一个单独功能的共同点。

    但是,我将如何实现这样的系统。基本思想是将 id 替换为实际上“无法猜测的”token

    1 - 为您要保护的资源创建一个token 列(index: trueunique: true

    2 - 在模型中,添加验证、生成器、回调和覆盖to_param

    validates :token, presence: true
    validates :token, uniqueness: true
    
    before_validation :generate_token, on: :create
    
    def generate_token
      begin
        self.token = SecureRandom.urlsafe_base64(64, false)
      end while self.class.find_by(token: token)
    end
    
    def to_param
      token
    end
    

    3 - 更改路由以使用 :token 作为 url 参数

    resources :things, param: :token
    

    4 - 将控制器更改为通过令牌而不是 id 查找

    @thing = Thing.find(params[:id])              # change this
    @thing = Thing.find_by(token: params[:token]) # to this
    

    现在,thing_url(@thing) 将返回一个您可以安全分享的网址:

    http://example.com/things/KSwdmTuDSVOGLTHtjK-RU78x7Bme_g-noTrNcovrtXioxPletLvNK35ia_F8CpIBtNDv-_xQ5bZ8uuv18msD4w
    

    当然,您需要将thingThing 分别替换为您的型号名称。

    【讨论】:

    • 哇,非常感谢这个详细的回答!
    • 不客气!顺便说一句,添加了一些我在第一个版本中忘记的有用验证......干杯!
    • 我实现了这个解决方案并且它有效!我想知道:是否还有一种方法可以显示普通 URL(使用 /things/id),同时将令牌 URL 重定向到 /things/id?
    • 你可以在路由中设置param: :token_or_id,然后决定在控制器中做什么。基本上有两条路径:(a) 使用find(...) 通过id 查找事物,然后检查用户是否有权访问它(b) 否则使用find_by(token: ...) 通过令牌查找事物。但是我不知道为这些情况添加单独的 url 助手的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 2012-02-09
    • 2011-11-30
    • 2012-03-08
    • 1970-01-01
    • 2014-02-07
    • 2019-05-16
    • 2016-07-13
    相关资源
    最近更新 更多