文档说:
如果您需要在已签名 blob 引用的隐匿性安全因素之外实施访问保护,则需要实现自己的经过身份验证的重定向控制器。
这不是特别有用。为此,您需要创建自己的控制器来服务 blob:
class BlobsController < ApplicationController
include ActiveStorage::SetBlob
before_action :authorize_blob
def show
expires_in ActiveStorage::Blob.service.url_expires_in
redirect_to @blob.service_url(disposition: params[:disposition])
end
private
def authorize_blob
# Your authorization code goes here
end
end
然后你需要设置你的路由:
get '/blobs/:signed_id/*filename' => "blobs#show", as: "service_blob"
direct :blob do |blob, options|
route_for(:service_blob, blob.signed_id, blob.filename, options)
end
resolve("ActiveStorage::Blob") { |blob, options| route_for(:blob, blob, options) }
最后,您需要禁用不安全的默认控制器,以便知识渊博的用户无法绕过您的授权。
如果您使用的是 Rails 6.1+,您可以通过config.active_storage.draw_routes
在 application.rb 中设置为 false 来做到这一点。但是您需要确保其余的 ActiveStorage 路由是手动绘制的,并且其中有很多。您可以在 Github 上查看它们。
否则,您将需要添加扩展控制器以重定向到您的新控制器(或完全关闭它)。您可以将以下内容添加到初始化程序中:
module ActiveStorageRedirect
def self.included(controller)
controller.before_action :redirect_to_authenticated
end
private
def redirect_to_authenticated
redirect_to Rails.application.routes.url_helpers.blob_path(@blob)
end
end
ActiveStorage::Blobs::RedirectController.include(ActiveStorageRedirect) # For Rails >= 6.1
ActiveStorage::Blobs::ProxyController.include(ActiveStorageRedirect) # For Rails >= 6.1
# ActiveStorage::BlobsController.include(ActiveStorageRedirect) # For Rails < 6.1