Railsプロジェクトがあります。私のプロジェクトでは、サーバーに画像をロードします(レール3 +ペーパークリップ+デバイス+カンカン)。ファイルへのアクセスを制限したい(例えば、元画像は管理者だけが閲覧できるようにしたい)。どうすればいいですか?
2 に答える
データベース内の属性によって制限している場合、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
ファイルは で処理されActionDispatch::Static
ます。IMO の最善の解決策は、同様のミドルウェア ( Rails ソース コードに基づく) を提供することですが、いくつかの認証を使用して前に挿入しActionDispatch::Static
ます。これは、ミドルウェアで認証を行うため、Warden ベースのソリューション (Devise など) で機能します。ミドルウェアが Warden の後に配置されActionDispatch::Static
、その直後に古いプレーンが実行されるようにしてください。
編集:注目に値するもう1つのこと。本番環境では、Nginx (Apache などについてはよくわかりません) がすべての静的ファイルを単独で提供するように構成されており、これらの要求をラック スタックに渡さないことは非常に一般的です。この Nginx の機能を無効にする必要がある場合があります。