我想保护我网站上的一些文件,但我也想授予某些用户下载这些文件的权限。最好的方法是什么?
我只有一个想法 - 生成临时随机 URL 之类的/files/hdad8fda299asnfqe/foo.bar
但我几乎不希望其他用户不能使用其他 URL。
您知道任何可以帮助我或建议另一种保护文件的方法的宝石吗?
我想保护我网站上的一些文件,但我也想授予某些用户下载这些文件的权限。最好的方法是什么?
我只有一个想法 - 生成临时随机 URL 之类的/files/hdad8fda299asnfqe/foo.bar
但我几乎不希望其他用户不能使用其他 URL。
您知道任何可以帮助我或建议另一种保护文件的方法的宝石吗?
确保真正下载的唯一方法是将它们移到“公共”路径之外,并通过检查授权的控制器将它们提供给用户。最有效的方法(据我所知)是使用 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 而不是文件名并确定关联模型的路径,但原理是相同的。