После некоторых исследований я нашел виновника и решил проблему.Здесь я хотел бы поделиться своими знаниями.
Как я уже упоминал в этом вопросе, были получены исключения:
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: <b>/admin</b>/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] }
# ...
Теперь каждый зарегистрированный пользователь может получить доступ к медиа.Это решение сработало для меня.
Однако это не универсальный рецепт.Пожалуйста, проверьте главу Безопасность в официальной документации, чтобы получить более подробную информацию.