Rails 5.2:授权访问ActiveStorage :: BlobsController#show

3
我想授权访问ActiveStorage附件,并查看BlobsController的源代码(https://github.com/rails/rails/blob/master/activestorage/app/controllers/active_storage/blobs_controller.rb),其中说明如下:
# Take a signed permanent reference for a blob and turn it into an expiring service URL for download.
# Note: These URLs are publicly accessible. If you need to enforce access protection beyond the
# security-through-obscurity factor of the signed blob references, you'll need to implement your own
# authenticated redirection controller.
class ActiveStorage::BlobsController < ActiveStorage::BaseController
  include ActiveStorage::SetBlob

  def show
    expires_in ActiveStorage.service_urls_expire_in
    redirect_to @blob.service_url(disposition: params[:disposition])
  end
end

但是即使上面的注释建议创建一个自定义控制器,我也需要覆盖ActiveStorage生成的路由,因为它们指向原始控制器,并在我的 routes.rb 上重新定义似乎会引发异常。此外,我不想再公开这些路由,因为它们没有被授权,有人可以获取blob的signed_id并使用原始端点获取附件。 循环遍历应用程序初始化时的路由,删除旧的ActiveStorage路由并插入新的路由似乎是目前最好的解决方案,但我想避免这种情况。 有什么建议吗?
1个回答

2
创建一个新的控制器来覆盖最初的回答:app/controllers/active_storage/blobs_controller.rb,然后根据您的需求添加相应的授权方法。
#app/controllers/active_storage/blobs_controller.rb
class ActiveStorage::BlobsController < ActiveStorage::BaseController
  include ActiveStorage::SetBlob

  def show
    redirect_to @blob.service_url(disposition: params[:disposition])
    authorize! :show, @blob # NOT TESTED!
  end

end
<最初的回答> 当您点击附件链接时,会触发show操作。
@blob.class #=> ActiveStorage::Blob

只需要修复一下,authorize! 应该放在方法的开头,或者在控制器的顶部放置一个 authorize_resource - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接