ruby-on-rails - 在 Rails 3 上设置文件下载权限的最佳方法

标签 ruby-on-rails security file download

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

我只有一个想法 - 生成临时随机 URL,如 /files/hdad8fda299asnfqe/foo.bar
但我几乎不希望其他用户不能使用其他 URL。

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

最佳答案

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

例如,首先你在你的应用程序中创建一个新目录,比如说“downloads”(当然你可以给它起任何名字,你可以把它放在你的 Rails 服务器可以访问的系统中的任何地方。)

mkdir downloads

现在为下载创建一个不错的新路径:
match '/downloads/*filename' => 'downloads#download'

然后创建一个新 Controller (或只是现有 Controller 中的一个 Action )
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 而不是文件名并确定关联模型的路径,但原理是相同的。

关于ruby-on-rails - 在 Rails 3 上设置文件下载权限的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12729046/

相关文章:

ruby-on-rails - 将包含 AM/PM 的 12 小时时间字符串转换为 24 小时时间

ruby-on-rails - ActiveRecord 集合和自定义方法

ruby-on-rails - 寻找在 Ruby on Rails 中构建安全 REST API 的建议

c# - 在出现不可恢复的错误后,如何终止 IIS 上的 ASP.NET 应用程序?

file - 从Plist播放音频文件

c++ - 大整数被误读/误写入二进制文件

c# - 进度条和文件加载

javascript - Rails 4 - 在生产中,我的 javascript 已加载,但在开发中运行良好时无法运行

mysql - 有没有办法按单一类型对具有多个属性类型的对象进行排序?

c# - 保护数据库连接字符串