我正在寻找一种创建和分享链接以保护Rails视图的方法。
在我的应用程序中,用户可以创建项目页面。我希望允许用户创建分享链接,以便只有具有链接的收件人才能访问项目页面并在该页面上留下评论。我甚至可能想要为链接添加密码保护。
是否有适用的gem呢?
在我的应用程序中,用户可以创建项目页面。我希望允许用户创建分享链接,以便只有具有链接的收件人才能访问项目页面并在该页面上留下评论。我甚至可能想要为链接添加密码保护。
是否有适用的gem呢?
我不知道任何关于保护链接的宝石,我可以想象这样的个性化功能很难找到一个共同点。
然而,这里是我如何实现这样一个系统。基本思路是用一个几乎“难以猜测”的token
替换id。
1 - 为您想要保护的资源创建一个token
列(index:true
,unique: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
当然,你需要分别用你的模型名称替换thing
和Thing
。
param: :token_or_id
,然后在控制器中决定要做什么。基本上有两种路径:(a) 通过find(...)
按 id 查找物品,然后检查用户是否有权访问它 (b) 否则通过find_by(token: ...)
按 token 查找物品。但是我不知道如何为这些情况添加单独的 URL 帮助程序。 - Patrick Oscity