4

我想保护我网站上的一些文件,但我也想授予某些用户下载这些文件的权限。最好的方法是什么?

我只有一个想法 - 生成临时随机 URL 之类的/files/hdad8fda299asnfqe/foo.bar

但我几乎不希望其他用户不能使用其他 URL。

您知道任何可以帮助我或建议另一种保护文件的方法的宝石吗?

4

1 回答 1

4

确保真正下载的唯一方法是将它们移到“公共”路径之外,并通过检查授权的控制器将它们提供给用户。最有效的方法(据我所知)是使用 xsendfile。

例如,首先你在你的应用程序中创建一个新目录,比如说“downloads”(当然你可以给它起任何名字,你可以把它放在你的 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

让用户#can_download?处理权限检查..

如果文件属于一个对象而不是文件系统中的松散文件,则有点不同,您必须询问 id 而不是文件名并确定关联模型的路径,但原理是相同的。

于 2012-10-04T14:19:40.263 回答