Ruby on Rails中的受保护共享链接

4
我正在寻找一种创建和分享链接以保护Rails视图的方法。
在我的应用程序中,用户可以创建项目页面。我希望允许用户创建分享链接,以便只有具有链接的收件人才能访问项目页面并在该页面上留下评论。我甚至可能想要为链接添加密码保护。
是否有适用的gem呢?
1个回答

18

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

然而,这里是我如何实现这样一个系统。基本思路是用一个几乎“难以猜测”的token替换id。

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) 将返回一个可以安全共享的URL:

http://example.com/things/KSwdmTuDSVOGLTHtjK-RU78x7Bme_g-noTrNcovrtXioxPletLvNK35ia_F8CpIBtNDv-_xQ5bZ8uuv18msD4w
当然,你需要分别用你的模型名称替换thingThing

哇,非常感谢您提供这么详细的答案! - Paco Vermeulen
不客气!顺便提一下,我在第一个版本中忘记添加一些有用的验证... 干杯! - Patrick Oscity
我实现了这个解决方案,它可以正常工作!我在想:是否有一种方法可以显示普通的URL(带有/things/id),同时将令牌URL重定向到/things/id? - Paco Vermeulen
你可以在路由中设置 param: :token_or_id,然后在控制器中决定要做什么。基本上有两种路径:(a) 通过 find(...) 按 id 查找物品,然后检查用户是否有权访问它 (b) 否则通过 find_by(token: ...) 按 token 查找物品。但是我不知道如何为这些情况添加单独的 URL 帮助程序。 - Patrick Oscity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接