Paperclip i zabezpiecznie pobierania plików

Witam.

Mam zrobione za pomocą authlogic logowanie. Zalogowany user widzi link z plikiem do ściągnięcia. Klika i ściąga. Ale jak podam bezpośrednią ścieżkę do pliku bez logowania to tez go ściągam. Jak zabezpieczyć się przed bezpośrednim dostępem do pliku niezalogowanej osoby, która zna bezpośrednia ścieżkę do pliku?

Pozdrawiam

jak masz pliki w public to tam do wszystkiego masz dostęp z poziomu przeglądarki wgeta itp. DocumentRoot jest ustawiony na public katalog i jak jest request do pliku np. public/files/some_file.txt to Apacha, nginx czy cokolwiek innego omija Railsy bo widzi ten pliczek

Tutaj masz artykuł o tym jak zrobić download pliku http://www.therailsway.com/2009/2/22/file-downloads-done-right - używając send_file możesz przesłać dowolny plik, nawet taki, który nie jest umieszczony w katalogu public.

Dlatego wystarczy, że zapiszesz gdzieś poza public (wtedy nie będzie możliwości ściągnięcia plików bez pośrednictwa railsów), a w akcji z downloadem sprawdzasz czy ktoś jest zalogowany. Jeżeli tak, to dajesz send_file, jeżeli nie to akces dinajd bro!

Przykladowy kod dla attachment_fu, podobnie moze dzialac i na paperclip ale osobiscie nie polecam zbyt duzo bledow.

Pole checksum to w zasadzie suma kontrolna obiektu a nie pliku, traktuj to bardziej jako prymitywny UUID do identyfikacji obiektu.

W tym konkretnym przypadku zalaczniki beda zapisywane do katalogu RAILS_ROOT/attachments/*

[code]class Attachment < ActiveRecord::Base
has_attachment :file_system_path => “attachments”

def after_initialize
if self.new_record?
self.checksum = FUNKCJA_GENERUJACA_UNIKALNY_HASH(self)
end
end
end

class AttachmentsController < ApplicationController
def download
@attachment = Attachment.find_by_checksum!(params[:id])
send_file(@attachment.full_filename, :type => @attachment.content_type, :disposition => ‘inline’)
end
end[/code]