簡體   English   中英

授權訪問附件(使用回形針gem)

[英]Authorizing Access to Attachments (using paperclip gem)

默認情況下:回形針gem將附件保存在公共目錄中。 據我了解:根據定義,公共目錄中的文件始終對用戶可用。 特別是如果用戶知道公共目錄中某個附件的URL:該附件是不安全的。

示例:這是使用回形針時圖像附件的默認保存文件結構:

default_saving_structure

因此,由於附件位於公共目錄內:如果任何人都知道以下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

我對授權庫Pundit非常熟悉。 但是,Pundit將無法停止訪問公共目錄中保存的附件。

問題 :我可以在哪里/如何保存附件,以便能夠授權訪問這些附件? 如果公用目錄不是保存它們的地方:我可以在哪里保存附件,以便在訪問附件之前必須成功進行身份驗證?

我熟悉這篇文章,但仍在努力弄清楚這一點。

回形針文檔

您有2個選擇:

首選是將上載的文件存儲在非公共目錄中,並提供控制器操作以驗證用戶身份並允許她下載文件。 您可以使用任何身份驗證庫。 至於下載部分,只需使用輔助方法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應用程序僅進行身份驗證。 它要快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM