Доступ запрещен для просмотра и загрузки маршрутов в SonataMediaBundle и Symfony 4

Я использую Symfony 4 (более точное 4.1) с SonataAdminBundle и SonataMediaBundle.

Это моя config/routes/sonata_media.yaml :

sonata_media_gallery:
    resource: '@SonataMediaBundle/Resources/config/routing/gallery.xml'
    prefix: /media/gallery

sonata_media:
    resource: '@SonataMediaBundle/Resources/config/routing/media.xml'
    prefix: /media

Если я запускаю php bin/console debug:router , в пути выводятся следующие маршруты:

sonata_media_gallery_index    ANY    ANY    ANY    /media/gallery/
sonata_media_gallery_view     ANY    ANY    ANY    /media/gallery/view/{id}
sonata_media_view             ANY    ANY    ANY    /media/view/{id}/{format}
sonata_media_download         ANY    ANY    ANY    /media/download/{id}/{format}

Первые два маршрута работают нормально, но когда я пробую два других маршрута, например:

http://localhost:8000/media/view/
http://localhost:8000/media/view/1/default
http://localhost:8000/media/download/1
http://localhost:8000/media/download/1/default

то я всегда получаю AccessDeniedException, хотя я аутентифицирован как ROLE_SUPER_ADMIN .

Ошибка возникает в vendor/sonata-project/media-bundle/src/Controller/MediaController.php в viewAction downloadAction и в viewAction . Я копал в исходном коде, но не могу найти причину исключения.

Всего 1 ответ


После некоторых исследований я нашел виновника и решил проблему. Здесь я хотел бы поделиться своими знаниями.

Как я упоминал в вопросе, исключения были выбраны из:

vendor/sonata-project/media-bundle/src/Controller/MediaController.php

в методах downloadAction и viewAction . Это было следующее if-условие:

if (!$this->get('sonata.media.pool')->getDownloadSecurity($media)->isGranted($media, $this->getCurrentRequest())) {
    throw new AccessDeniedException();
}

который присутствует в обоих методах. Это привело меня к vendor/sonata-project/media-bundle/src/Provider/Pool.php , а также к vendor/sonata-project/media-bundle/src/Security/RolesDownloadStrategy.php . Я не мог найти там какой-либо ошибки или проблемы, но я открыл глаза на другую позицию в моей собственной конфигурации:

access_control:
    - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
    - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }

Как я мог быть таким глупым? Путь /media не объявлен в security.yml и может быть доступен не прошедшим проверку подлинности пользователям. Для загрузки / просмотра медиаданных SonataMediaBundle требуется по умолчанию ROLE_ADMIN или ROLE_SUPER_ADMIN .

Маршруты для Gallery были доступны, потому что vendor/sonata-project/media-bundle/src/Controller/GalleryController.php не проверяет, предоставлен ли доступ.

Найдя виновника, встал вопрос, какой подход к решению проблемы

1) Измените префикс маршрута:

sonata_media:
    resource: '@SonataMediaBundle/Resources/config/routing/media.xml'
    prefix: /admin/media

Объявленный путь в security.yml теперь охватывает media а ROLE_ADMIN и ROLE_SUPER_ADMIN могут обращаться к маршрутам.

Недостаток: что, если вы хотите выставить средства массовой информации за пределами администратора? И что, если другие роли должны иметь к ним доступ.

2) Объявить новый путь в security.yml :

access_control:
    - { path: ^/media/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }

Теперь мы можем разоблачить средства массовой информации вне администратора. Но другая проблема все еще существует: что, если нужны другие роли для доступа к средствам массовой информации?

3) Настройте другую стратегию загрузки в конфигурации для SonataMedia:

sonata_media:
    # ...
    contexts:
        default:  # the default context is mandatory
            download:
                strategy: sonata.media.security.connected_strategy
                 mode: http
    # ...

и отрегулируйте путь:

access_control:
    # ...
    - { path: ^/media/, role: [IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED] }
    # ...

Теперь каждый зарегистрированный пользователь может получить доступ к медиа. Это решение сработало для меня.

Однако это не рецепт одного размера. Для получения более подробной информации ознакомьтесь с главой безопасности из официальной документации.


Есть идеи?

10000