Rails 5.2: авторизуйте доступ к ActiveStorage :: BlobsController # show - PullRequest
0 голосов
/ 07 июня 2019

Я хотел бы разрешить доступ к 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, похоже, вызывает исключение. Также я не хочу показывать этимаршрутов больше, поскольку они не авторизуются, и кто-то может взять signed_id большого двоичного объекта и получить вложение, используя исходную конечную точку. Цикл по маршрутам при инициализации приложения и удаление старых маршрутов ActiveStorage и вставка новых кажется лучшимрешение на данный момент, но я бы хотел избежать этого.

Есть предложения? 101

1 Ответ

1 голос
/ 07 июня 2019

Создайте новый контроллер для переопределения оригинала: 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
...