自分のサイトにあるいくつかのファイルを保護したいだけでなく、そのファイルをダウンロードする権限を一部のユーザーに付与したいと考えています。それを行う最良の方法は何ですか?
アイデアは 1 つだけです - 一時的なランダム URL を生成します。/files/hdad8fda299asnfqe/foo.bar
しかし、他のユーザーが他の URL を使用できないようにしたくはありません。
私に役立つ、またはファイルを保護する別の方法を提案できる宝石を知っていますか?
自分のサイトにあるいくつかのファイルを保護したいだけでなく、そのファイルをダウンロードする権限を一部のユーザーに付与したいと考えています。それを行う最良の方法は何ですか?
アイデアは 1 つだけです - 一時的なランダム URL を生成します。/files/hdad8fda299asnfqe/foo.bar
しかし、他のユーザーが他の URL を使用できないようにしたくはありません。
私に役立つ、またはファイルを保護する別の方法を提案できる宝石を知っていますか?
実際にダウンロードを保護する唯一の方法は、それらを「パブリック」パスの外に移動し、承認をチェックするコントローラーを介してユーザーにフィードすることです。これを行う最も効率的な方法 (私が知っている) は、xsendfile を使用することです。
たとえば、最初にアプリに新しいディレクトリを作成します。たとえば、「ダウンロード」としましょう (もちろん、名前は何でもかまいませんし、Rails サーバーがアクセスできるシステム内のどこにでも置くことができます)。
mkdir downloads
ダウンロード用の素敵な新しいルートを作成します。
match '/downloads/*filename' => 'downloads#download'
次に、新しいコントローラー (または既存のコントローラーのアクションのみ) を作成します。
class DownloadsController
def download
filename = [params[:filename], params[:format]].join('.')
path = Rails.root.join( 'downloads', filename )
if File.exists?(path) && user.can_download?( filename )
send_file( path, x_sendfile: true )
else
raise ActionController::RoutingError, "resource not found"
end
end
end
次に、に移動できます
/downloads/path/my_file.txt
User#can_download? 許可チェックを処理します。
ファイルがファイル システム内のルーズ ファイルではなくオブジェクトに属している場合は少し異なります。ファイル名ではなく ID を要求し、関連付けられたモデルからパスを決定する必要がありますが、原則は同じです。