如何通过Active Storage禁用自动生成的路由

Edu*_*ard 4 ruby-on-rails rails-activestorage ruby-on-rails-5.2

我正在将现有应用程序升级到Rails 5.2。

旧的应用程序正在使用Paperclip进行文件存储,而我正在尝试将其移至ActiveStorage。

我的应用程序公开了一个API,该API允许用户安全地上传文件(使用密钥/秘密对来签署请求)。

当我安装ActiveStorage时,我发现了几条新路线

      rails_service_blob GET  /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET  /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET  /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT  /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create
Run Code Online (Sandbox Code Playgroud)

我如何禁用这些路由以不允许随机上传到我的应用程序。

Ska*_*ddy 10

为了安全地删除所有ActiveStorage路由而没有副作用,请将其添加到config / application.rb中:

class Application < Rails::Application
   ...
   initializer(:remove_activestorage_routes, after: :add_routing_paths) {|app|
      app.routes_reloader.paths.delete_if {|path| path =~ /activestorage/}}
   ...
end
Run Code Online (Sandbox Code Playgroud)

我建议不要require 'rails/all'使用从rails源代码中获取的rails gem列表来替换config / application.rb,通常建议这样做。

  • 谢谢!这绝对有效,因为我已在应用程序中使用此功能删除了路线。我希望它们是可选的,并非所有使用ActiveStorage的应用程序都需要公共路由。这应该标记为已接受答案! (2认同)
  • 我确实建议替换 `require 'rails/all'`,因为这是 `rails new myapp --skip-active-storage` 生成器命令的作用,并且是不加载任何其他框架(例如 actioncable、a​​ctivejob)的约定、操作邮箱)。这里的答案(修改路由)将在不需要时耗尽加载 activestorage 框架的资源,并且将阻止其他习惯该约定的 Rails 开发人员查看“config/application.rb”的顶部来确定哪些框架已加载。 (2认同)