【问题标题】:Authorizing Access to Attachments (using paperclip gem)授权访问附件(使用回形针 gem)
【发布时间】:2016-01-10 23:08:38
【问题描述】:

默认情况下:回形针 gem 将附件保存在 public 目录中。据我了解:根据定义,公共目录中的文件始终可供用户使用。特别是如果用户知道公共目录中某个附件的 URL:该附件不安全。

示例:这是使用回形针时图像附件的默认保存文件结构:

因此,由于附件位于公共目录中:任何人只要知道此 url 就可以访问此图像:

#image accessible to everyone when stored in the public directory
http://localhost:3000/system/users/ex_imgs/000/000/031/original/nthornepng.png?1452466215

我对@9​​87654322@ 非常熟悉。但是,Pundit 将无法停止访问保存在公共目录中的附件。

问题:我可以在哪里/如何保存附件,以便我能够授权访问这些附件?如果公共目录不是保存它们的地方:我可以在哪里保存附件,以便在访问附件之前必须成功验证?

我对@9​​87654323@ 很熟悉,但仍在努力解决这个问题。

Paperclip Documentation

【问题讨论】:

    标签: ruby-on-rails ruby paperclip


    【解决方案1】:

    你有两个选择:

    第一选择是将上传的文件存储在非公共目录中,并提供控制器操作来验证用户并让她下载文件。您可以使用任何身份验证库。至于下载部分,就用helper方法send_file

    模型类

    class MyModel < ActiveRecord::Base
      has_attached_file :image, :path => '/non-public/dir/:attachment/:id/:style/:basename.:extension',
                                :url => '/downloads/:id'
    end
    

    控制器

    class DownloadsController
      def show
        # Authenticate user
        model = MyModel.find(params[:id])
        send_file model.image.path
      end
    end
    

    第二种选择很简单,将文件保存在公共目录中,但给它一个随机路径,很难猜到。您还必须提供一个控制器操作来验证用户身份,但这一次,您无需将文件发送给用户,而是将他们重定向到文件 URL。

    优点和缺点

    第一个选择非常安全,但它需要您的 rails 应用程序来处理文件下载。如果您使用的是线程或预分叉服务器,这可能会影响并发性。

    第二种选择不太安全,但你可以依靠你的 HTTP 服务器(例如 Nginx)来处理文件下载,而 rails 应用程序只做身份验证。它要快得多。

    【讨论】:

    • 谢谢!追问:你知道如何在不指定/使用url 选项的情况下显示图像吗?出于安全原因:我不想要每个图像的 url。换句话说:我想在页面中显示图像附件,但出于安全原因,我不想要该图像的 url。我只想显示图像,仅此而已。不下载图片。
    • 这有点棘手。从浏览器的角度来看,它呈现的每张图像都是公开的,因此您不能阻止用户下载页面上已经呈现的图像。但是你可以让页面引用原图的thumbnail版本。
    • 该死。行。好吧,我继续并将其作为一个单独的问题发布在这里。谢谢! stackoverflow.com/questions/34712862/…
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多