2010-03-06 3 views
1

Je travaille sur une application Rails et utilise le plugin d'authentification restful. L'application comprendra des images de l'utilisateur. Seuls les utilisateurs qui se connectent seront en mesure de naviguer, mais je me demandais si je pouvais également restreindre l'accès direct aux URL aux images pour autoriser uniquement les utilisateurs connectés. En d'autres termes, même si vous savez qu'une image est à thesite.com/user1/foo.jpg, vous ne pouvez pas voir cette image sauf si vous êtes connecté. Je sais que cela pourrait théoriquement être fait dans la configuration Apache, mais la seule façon savoir impliquerait l'édition manuelle de ces fichiers, ce qui ne serait pas à l'échelle.Rails - restreint l'accès URL aux images?

Est-ce possible? Cela aurait-il plus de sens de simplement déplacer les photos du répertoire public? (Je ne suis pas sûr si cela a des implications de performance, car public est généralement utilisé pour le contenu statique.)

+1

Il faudrait envoyer les images jettent le contrôleur comme David Antaramian dit, qui, selon votre userbase, pourrait être un goulot d'étranglement. Peut vouloir essayer de faire le filtrage de l'image plus haut sur la couche rack (http://guides.rubyonrails.org/rails_on_rack.html) ou même plus haut. – clyfe

+0

@clyfe - pourquoi cela pourrait-il être un goulot d'étranglement? Parce que les rails doivent être impliqués dans le traitement des données binaires au lieu de simplement laisser Apache le gérer? –

+0

Oui, Apache sera plus rapide que Ruby/Rails. – Eric

Répondre

3

Vous pouvez créer une action de contrôleur pour les images qui renvoie simplement les données binaires à l'utilisateur (à partir d'une source non publiquement . accessible) que si l'utilisateur est connecté en tant que préface, je suis une personne Django/Python, pas Ruby/Rails, mais ce que je peux dire, la configuration ressemblerait à ceci:

map.connect ':user/:picture', :controller => 'accounts', :action => 'displayPic' 

et votre contrôleur ressemblerait à quelque chose comme:

class AccountsController < ApplicationController 
    def image 
     # check if user is logged in, then 
     user = Account.find(params[:user]) 
     image = get_image(user, params[:picture]) 
     send_data(image, 
      :filename => "#{params[:picture]}", 
      :type => "image/jpeg") 
    end 

private 

    def get_image(image_name) 
     # do something to find image 
     # and return the binary data 
     # to the action 
    end 
end 

fait de ce wiki de la communauté afin que toute personne avec de meilleurs Ruby/compétences Rails peut nettoyer

2

juste besoin un utilisateur pour l'action:

# images_controller.rb 
ImagesController < ApplicationController 

    before_filter :require_user, :only => 'show' 

    def require_user 
    unless current_user 
     redirect_to root_url # or :back, or wherever 
    end 
    end 

end 

Cependant, voulez-vous dire vraiment accès direct à l'image non par http://yoursite.com/userfoo/bar.jpg, mais via http://yoursite.com/images/system/file/5837/bar.jpg? Au sein des rails, vous pouvez vérifier l'objet de requête:

# images_controller.rb 
ImagesController < ApplicationController 

    before_filter :require_onsite, :only => 'show' 

    def require_onsite 
    # pseudoruby, might need some massage 
    unless request.referer.match(/request.domain/) 
     redirect_to root_url 
    end 
    end 

end 
+0

Si l'URL est http://yoursite.com/images/system/file/5837/bar.jpg, vous voulez vérifier l'objet de requête. Est-ce que cela fonctionne dans Ruby on Rails 3? Je n'ai pas trouvé de référence. Merci – DDDD

+0

Voir ici: http://stackoverflow.com/questions/2165665/how-do-i-get-the-current-url-in-ruby-on-rails – Eric