【问题标题】:Ruby on Rails file authorization under RAILS_ROOT/publicRAILS_ROOT/public 下的 Ruby on Rails 文件授权
【发布时间】:2021-05-11 20:17:13
【问题描述】:

我正在寻找一种对位于我的公共文件夹下的文件运行check_access 类型的方法。我听说过 RAILS_ROOT/private。我相信这个目录可以满足我的需求。

但我没有关于它的深入信息。我的核心思想是提供文件以仅使用具有查看/下载文件能力的文件。比如张贴的图片,我不希望它们公开。目前,所有知道指向正确目录的 URL 的人都可以访问所有文件。

PS:/public 目录下的文件是通过carrierwave gem 上传的。

谢谢。

【问题讨论】:

  • 我不知道你从哪里得到RAILS_ROOT/private 做任何事情的想法。

标签: ruby-on-rails carrierwave


【解决方案1】:

如果您需要对您的文件进行访问控制,您不想从您的公用文件夹中提供这些文件。您的公用文件夹是由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

【讨论】:

  • 感谢您的帮助,我会试试这个。
【解决方案2】:

您可以在数据库中定义权限,然后您可以在向用户显示文件的 url 之前添加检查。如果您希望限制文件,则不应将文件保存在公用文件夹中。

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 2012-10-23
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多