Ruby 在 Rails 上 RAILS_ROOT/public 下的文件授权
Ruby on Rails file authorization under RAILS_ROOT/public
我正在寻找一种方法 运行 一种 check_access
到我的 public 文件夹下的文件。我听说了 RAILS_ROOT/private。我相信这个目录满足了我的需求。
但我没有关于它的深入信息。我的核心思想是只使用能够 view/download 文件的服务文件。比如一张贴图,我不希望它们是public。目前,所有知道 URL 指向正确目录的人都可以访问所有文件。
PS: /public目录下的文件是通过载波上传gem.
谢谢。
您可以在数据库中定义权限,然后在向用户显示文件的 url 之前添加检查。如果您希望这些文件受到限制,则不应将它们保留在 public 文件夹中。
如果您需要对文件进行访问控制,您不想从 public 文件夹中提供这些文件。您的 public 文件夹由 ActionDispatch::StaticFile
或直接由您的网络服务器提供服务器 - 两者都没有提供您想要的访问控制类型。
相反,您将创建一个提供文件的控制器:
class FilesController < ActionController::Metal
before_action :authenticate! # you need to implement this
before_action :authorize! # you need to implement this
# GET /files/:filename
def show
path = Rails.root.join(
'uploads', # can be any directory you want really
# avoids a malicous user being able to use for example '../../secret/password'
ActiveStorage::Filename.new(params[:file_name]).sanitized
)
if File.exist?(path)
send_file path
else
head :not_found
end
end
end
我正在寻找一种方法 运行 一种 check_access
到我的 public 文件夹下的文件。我听说了 RAILS_ROOT/private。我相信这个目录满足了我的需求。
但我没有关于它的深入信息。我的核心思想是只使用能够 view/download 文件的服务文件。比如一张贴图,我不希望它们是public。目前,所有知道 URL 指向正确目录的人都可以访问所有文件。
PS: /public目录下的文件是通过载波上传gem.
谢谢。
您可以在数据库中定义权限,然后在向用户显示文件的 url 之前添加检查。如果您希望这些文件受到限制,则不应将它们保留在 public 文件夹中。
如果您需要对文件进行访问控制,您不想从 public 文件夹中提供这些文件。您的 public 文件夹由 ActionDispatch::StaticFile
或直接由您的网络服务器提供服务器 - 两者都没有提供您想要的访问控制类型。
相反,您将创建一个提供文件的控制器:
class FilesController < ActionController::Metal
before_action :authenticate! # you need to implement this
before_action :authorize! # you need to implement this
# GET /files/:filename
def show
path = Rails.root.join(
'uploads', # can be any directory you want really
# avoids a malicous user being able to use for example '../../secret/password'
ActiveStorage::Filename.new(params[:file_name]).sanitized
)
if File.exist?(path)
send_file path
else
head :not_found
end
end
end