Доступ запрещен для просмотра и загрузки маршрутов в SonataMediaBundle и Symfony 4 - PullRequest
0 голосов
/ 22 октября 2018

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

1 Ответ

0 голосов
/ 29 октября 2018

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

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

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] }
    # ...

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

Однако это не универсальный рецепт.Пожалуйста, проверьте главу Безопасность в официальной документации, чтобы получить более подробную информацию.

...