[英]Authorizing Access to Attachments (using paperclip gem)
默認情況下:回形針gem將附件保存在公共目錄中。 據我了解:根據定義,公共目錄中的文件始終對用戶可用。 特別是如果用戶知道公共目錄中某個附件的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
我對授權庫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.