4

自分のサイトにあるいくつかのファイルを保護したいだけでなく、そのファイルをダウンロードする権限を一部のユーザーに付与したいと考えています。それを行う最良の方法は何ですか?

アイデアは 1 つだけです - 一時的なランダム URL を生成します。/files/hdad8fda299asnfqe/foo.bar

しかし、他のユーザーが他の URL を使用できないようにしたくはありません。

私に役立つ、またはファイルを保護する別の方法を提案できる宝石を知っていますか?

4

1 に答える 1

4

実際にダウンロードを保護する唯一の方法は、それらを「パブリック」パスの外に移動し、承認をチェックするコントローラーを介してユーザーにフィードすることです。これを行う最も効率的な方法 (私が知っている) は、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 を要求し、関連付けられたモデルからパスを決定する必要がありますが、原則は同じです。

于 2012-10-04T14:19:40.263 に答える