4

Railsプロジェクトがあります。私のプロジェクトでは、サーバーに画像をロードします(レール3 +ペーパークリップ+デバイス+カンカン)。ファイルへのアクセスを制限したい(例えば、元画像は管理者だけが閲覧できるようにしたい)。どうすればいいですか?

4

2 に答える 2

4

データベース内の属性によって制限している場合、1 つの方法はコントローラーを介して画像を提供することです。最高のパフォーマンスではありませんが、安全です。

私はこれを試していませんが、次のような URL から画像を提供している場合

/images/picture_of_mickey_mouse.png

次に/images、ファイル名属性で応答するアプリでルートを作成し、コントローラーを介してこれらすべての画像を提供できます。

例えば

class ImagesController < ApplicationController
  before_filter :authenticate_admin!, :only => [:show]
  def show
    send_file "/images/#{params[:filename]}", :disposition => 'inline'
  end
end

ただし、必ずサニタイズする必要がありますparams[:filename]。そうしないと、ユーザーはサーバー上の任意のファイルをダウンロードできます。

ドキュメントsend_fileはこちら: http://apidock.com/rails/ActionController/DataStreaming/send_file

于 2013-01-13T17:30:35.103 に答える
2

ファイルは で処理されActionDispatch::Staticます。IMO の最善の解決策は、同様のミドルウェア ( Rails ソース コードに基づく) を提供することですが、いくつかの認証を使用して前に挿入しActionDispatch::Staticます。これは、ミドルウェアで認証を行うため、Warden ベースのソリューション (Devise など) で機能します。ミドルウェアが Warden の後に配置されActionDispatch::Static、その直後に古いプレーンが実行されるようにしてください。

編集:注目に値するもう1つのこと。本番環境では、Nginx (Apache などについてはよくわかりません) がすべての静的ファイルを単独で提供するように構成されており、これらの要求をラック スタックに渡さないことは非常に一般的です。この Nginx の機能を無効にする必要がある場合があります。

于 2013-01-13T17:40:07.610 に答える