2009-06-22 7 views
0

Je me demandais comment je peux laisser un utilisateur connecté télécharger son et seulement ses fichiers sur le serveur. Par exemple, personne d'autre, mais seulement je peux télécharger les documents de mes documents Google lorsque je me suis connecté. Y at-il une page de concept que vous avez un lien vers utile que je peux lire sur? Y a-t-il un livre comme un livre de recettes qui pourrait être plus détaillé et plus précis sur l'implémentation dans Rails? Et y a-t-il un gem/plugin qui le fait déjà?Qu'est-ce qu'un concept de travail pour distribuer des téléchargements protégés/individuels dans Rails?

Merci

Répondre

1

Je suggère de créer un contrôleur qui limite l'accès aux téléchargements. L'astuce consiste à servir le fichier via un contrôleur, pas directement à partir d'Apache. Je suppose que vous utilisez RestfulAuthentication et Paperclip ici:

C'est le modèle (une photo qui a une image en pièce jointe)

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 

Notez l'attribut url qui, en combinaison avec l'itinéraire ci-dessous , forcera l'accès à l'image via un contrôleur et non directement à partir du répertoire public. Notez également l'attribut: path qui spécifie un répertoire de ressources privées au lieu de celui public par défaut.

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

Maintenant, c'est le contrôleur simple qui exige que l'utilisateur soit connecté, vérifie l'ID utilisateur et envoie le fichier approprié à l'utilisateur.

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 

Vous devez également spécifier :x_sendfile => true dans send_file pour améliorer les performances en laissant Apache prendre la souche de servir effectivement le fichier une fois que le contrôleur a approuvé.

+0

C'est fantastique! Merci pour votre instruction en profondeur. Mon esprit est certainement plus reposé en sachant qu'il y a une limite à qui peut télécharger quoi. Maintenant, cette entreprise PaperClip, en termes simples, une fois installé intercepterait «toutes» les URL est-ce l'histoire?- (Si je me souviens bien, bien que je ne me souvienne pas où, j'ai lu un article ou peut-être un eBook qui mentionne le contrôleur + les actions des applications de Rails sont vos seules possibilités pour les URLs, n'est-ce pas? Merci encore! –

+0

hmmm Je ne suis pas sûr de ce que vous voulez dire Je vous suggère de commencer lentement avec une simple application de rails, en le construisant progressivement RestfulAuthentication consiste à amener les utilisateurs à s'inscrire, se connecter, se déconnecter et s'assurer que certaines pages sont seulement Paperclip est un plugin pour la gestion des téléchargements de fichiers, qui consiste essentiellement à stocker le fichier et à gérer les métadonnées qui s'y rapportent (chemin d'accès, etc.). , taille, type) dans votre base de données. 210 Le point crucial de la solution est que le contrôleur des actifs – ideasasylum

0

« laisser un utilisateur connecté télécharger et ses seulement ses fichiers sur le serveur »

Avez-vous un moyen de savoir qui est propriétaire unique quel fichier? C'est le point de départ, si disons que les fichiers sont des images et que vous voulez seulement que je voie mes images, puis lors de l'enregistrement des images, assurez-vous de stocker avec les données d'image mon identifiant d'utilisateur.

Une fois connecté, vous ne sélectionnez que ce qui m'appartient. Jetez un oeil sur le tableau ci-dessous (exemple des images, en supposant qu'ils sont stockés dans FileSystem)

photos (id, titre, desc, nom_fichier, user_id *) * ID utilisateur est l'ID de la personne qui est connecté

Ces plugins peuvent aider

  • authentification RESTful
  • ActiveACL (ou tout autre plug-in d'autorisation)
  • PaperClip (upload de fichier)
+0

Merci Ngetha; Un identifiant unique pour trouver un utilisateur unique est là et je suppose que la nature de ma question (ou FEAR!) Est que je suis assez terrifié par l'idée que quelqu'un puisse deviner l'URL d'un certain fichier. Est-ce possible dans Rails? Ou n'est-ce pas impossible parce que chaque URL est un http: // dns/[controller] [,/action] [,/id]? –

Questions connexes