Rails 5.2: авторизуем доступ к ActiveStorage :: BlobsController # show

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

Какие-либо предложения? ????


person Pere Joan Martorell    schedule 07.06.2019    source источник


Ответы (1)


Создайте новый контроллер, чтобы заменить исходный: 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
person iGian    schedule 07.06.2019
comment
просто нужно исправить, authorize! должен быть помещен в начало метода или authorize_resource в верхней части контроллера - person Pere Joan Martorell; 08.06.2019