【问题标题】:How to prevent user from accessing other user's Active Storage files如何防止用户访问其他用户的 Active Storage 文件
【发布时间】:2020-05-21 18:58:09
【问题描述】:

在我的 Rails 应用程序中,我想阻止用户访问其他用户的 Active Storage 文件。

我尝试了here 所示的解决方案,但如果我将一个链接指向特定用户的文件,我仍然能够以其他用户身份访问该文件。例如,如果我包含以下代码,我的 Rails 应用程序允许我下载该文件,即使它属于不同的用户。我希望它重定向到其他地方,而不是让我下载不是我的文件。

rails_blob_path(User.find(57).file, disposition: "attachment")

我读到 Active Storage 使用“隐蔽的安全性”。这是否意味着,只要我没有像上面所做的那样在我的应用程序中包含对特定用户文件的直接引用(即,另一个用户文件的 Rails blob 路径),我可以确信用户不能访问彼此的文件?还是有其他方法可以防止这种情况发生?

【问题讨论】:

  • 为什么不使用pundit gem 来处理授权呢?其他方式,如果访问该信息的用户不是所有者,则只需在控制器操作中添加一个条件到 redirect_to some_path,本质上是:redirect_to some_path unless @file.user == current_user
  • @ARK 我无法弄清楚 1) 哪个控制器,2) 哪个操作,以及 3) 如何指定选定的 blob(因为用户可以拥有不止一种类型的文件)跨度>
  • 没有用户可以访问除您定义之外的路由,因此您需要在与允许任何用户访问 blob 的路由相对应的控制器操作中处理此问题。我认为这很简单。如果仍然感到困惑,请分享为用户获取 blob 的任何控制器操作的代码,我会用可能的代码来回答。

标签: ruby-on-rails devise rails-activestorage


【解决方案1】:

您可以这样做以仅允许文件所有者和管理员用户访问,例如在歌曲的控制器中

before_action :require_same_user, only: [:show, :edit, :update, :destroy]


  def require_same_user
  if current_user != @song.user and !current_user.admin?
    redirect_to root_path, alert: "Access Denied!"
  end  
end

如果您没有管理员用户,请删除 current_user.admin

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2018-04-27
    • 1970-01-01
    • 2015-10-23
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多