2009-06-22 4 views
0

Ich frage mich, wie ich einen eingeloggten Benutzer seine und nur seine Dateien auf dem Server herunterladen lassen kann. Zum Beispiel kann niemand anderes als ich die Dokumente meiner Google Docs herunterladen, wenn ich mich eingeloggt habe. Gibt es eine Konzeptseite, auf der Sie einen Link haben, den ich lesen kann? Gibt es ein Buch wie ein Rezeptbuch, das detaillierter auf die Implementierung in Rails eingehen könnte? Und gibt es ein Juwel/Plugin, das schon funktioniert?Was ist ein funktionierendes Konzept für die Bereitstellung geschützter/einzelner Downloads in Rails?

Dank

Antwort

1

Ich würde vorschlagen, einen Controller zu erstellen, der den Zugriff auf die Downloads beschränkt. Der Trick besteht darin, die Datei über einen Controller zu liefern, nicht direkt von Apache. Ich gehe davon aus, dass Sie hier RestfulAuthentication und Büroklammer verwenden:

Dies ist das Modell (ein Foto, das ein Bild Anlage hat)

class Photo < ActiveRecord::Base 
    belongs_to :user 

    has_attached_file :image, #:styles => {:thumbnail => "100x100#", :large => "800x600>"}, 
    :path => ":rails_root/assets/:attachment/:id_partition/:style/:basename.:extension", 
    :url => "/assets/:userid/:attachment/:id/:style" 
end 

Beachten Sie die URL-Attribut mit der Route, die, in Kombination unter , erzwingen Sie den Zugriff auf das Image über einen Controller und nicht direkt aus dem öffentlichen Verzeichnis. Beachten Sie auch das Pfadattribut, das anstelle des öffentlichen Standardverzeichnisses ein privates Verzeichnis angibt.

map.assets 'assets/:userid/:attachment/:id/:style', :controller => 'assets', :action => 'get', :conditions => {:method => :get } 

Nun, dies ist die einfache Steuerung, die den Benutzer eingeloggt sein erfordert, prüft die Benutzer-ID und sendet die entsprechende Datei an den Benutzer zurück.

class AssetsController < ApplicationController 
    before_filter :login_required 

    def get 
    if current_user.id == params[:userid].to_i 
     @photo = Photo.find params[:id] 
     send_file @photo.image.path(params[:style]), :type => @photo.image_content_type, :disposition => 'inline' 
    else 
     render :nothing => true 
    end 
    end 
end 

Sie sollten auch :x_sendfile => true in send_file geben Sie die Leistung, indem sie Apache nimmt die Belastung tatsächlich dazu dient, die Datei zu verbessern, sobald der Controller sie genehmigt hat.

+0

Das ist fantastisch! Vielen Dank für Ihre ausführliche Anleitung. Mein Verstand ist sicherlich ruhiger, da er weiß, dass es eine Beschränkung gibt, wer was herunterladen darf. Jetzt würde dieses PaperClip-Geschäft, in einfachen Worten einmal installiert, "alle" URLs abfangen, ist das die Geschichte?- (Wenn ich mich recht erinnere, obwohl ich mich nicht erinnern kann, wo ich gelesen habe, ein Artikel oder vielleicht ein eBook, das erwähnt hat, dass Rails 'Apps Controller + Aktionen Ihre einzigen Möglichkeiten für URLs sind, ist das richtig? Vielen Dank nochmal! –

+0

hmmm ... nicht ganz sicher, was du meinst. Ich würde vorschlagen, dass du langsam mit einer einfachen Rails-App beginnst und sie langsam aufbaust. Bei RestfulAuthentication geht es darum, dass Benutzer sich registrieren, anmelden, abmelden und sicherstellen, dass bestimmte Seiten nur vorhanden sind sichtbar für eingeloggte Benutzer.Es bietet den login_required Filter und current_user Variable, die Sie oben sehen .. Paperclip ist ein Plugin für die Verwaltung von Datei-Uploads.Im Wesentlichen übernimmt es die Aufgabe der Speicherung der Datei und Verwalten der Metadaten darüber (dh Pfad , Größe, Typ) in Ihrer Datenbank. Der Hauptpunkt der Lösung ist der Asset-Controller – ideasasylum

0

„ein in Benutzer sein und nur seine Dateien auf dem Server herunterladen angemeldet lassen“

Haben Sie eine Möglichkeit, eindeutig zu wissen, wer was besitzt Datei? Dies ist der Ausgangspunkt, wenn Sie sagen, dass die Dateien Bilder sind und Sie möchten nur, dass ich meine Bilder sehe, dann stellen Sie beim Speichern (Hochladen) der Bilder sicher, dass Sie zusammen mit den Bilddaten meine Benutzer-ID speichern.

Also einmal eingeloggt, wähle nur was mir gehört. Werfen Sie einen Blick auf die Tabelle unten (Bilder Beispiel, vorausgesetzt, sie in Filesystem gespeichert sind)

Fotos (id, Titel, desc, file_name, User_id *) * User-ID ist die ID der Person, die in

angemeldet ist

Diese Plugins können

  • rESTful Authentifizierung
  • ActiveACL (oder eine andere Berechtigung Plugin)
  • Paperclip (File-Uploads)
helfen
+0

Danke Ngetha; Eine eindeutige ID, um einen eindeutigen Benutzer zu finden, ist da und ich denke, die Natur meiner Frage (oder FEAR!) Ist, dass ich ziemlich erschrocken bin von der Idee, dass jemand die URL zu bestimmten Dateien erraten könnte. Ist das in Rails möglich? Oder ist es nicht unmöglich, weil jede URL ein http: // dns/[Controller] [,/action] [,/id] ist? –

Verwandte Themen