SonatamaDiabundle和Symfony 4中的查看和下载路由被拒绝访问

SonatamaDiabundle和Symfony 4中的查看和下载路由被拒绝访问,symfony,symfony4,sonata-media-bundle,symfony-routing,Symfony,Symfony4,Sonata Media Bundle,Symfony Routing,我将Symfony 4(更精确的是4.1)与SonataAdminBundle和SonataDiabundle一起使用 这是我的config/routes/sonata\u media.yaml: sonata_media_gallery: resource: '@SonataMediaBundle/Resources/config/routing/gallery.xml' prefix: /media/gallery sonata_media: resource: '

我将Symfony 4(更精确的是4.1)与SonataAdminBundle和SonataDiabundle一起使用

这是我的
config/routes/sonata\u 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
access_control:
    - { path: ^/media/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
如果我运行
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\u SUPER\u ADMIN


错误发生在
downloadAction
viewAction
中的
vendor/sonata project/media bundle/src/Controller/MediaController.php
中。我在翻源代码,但找不到引发异常的原因。

经过一些研究,我找到了罪魁祸首并解决了问题。在这里我想分享我的知识

正如我在问题中提到的,异常是从以下位置引发的:

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
。我在那里找不到任何bug或问题,但它让我看到了我自己配置中的另一个位置:

access_control:
    - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
    - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
我怎么会这么笨?路径
/media
未在
security.yml
中声明,未经身份验证的用户可以访问该路径。
SonataMediaBundle
要求每个默认的
ROLE\u ADMIN
ROLE\u SUPER\u ADMIN
下载/查看媒体

由于
供应商/sonata项目/media bundle/src/Controller/GalleryController.php
未检查是否授予访问权限,因此可以访问
库的路由

找到罪犯后,问题是选择哪种方法来解决问题

1) 更改路由前缀:

sonata_media:
    resource: '@SonataMediaBundle/Resources/config/routing/media.xml'
    prefix: /admin/media
现在我们可以在管理员之外公开媒体。但另一个问题仍然存在:如果其他角色需要访问媒体怎么办

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] }
    # ...
现在,每个登录的用户都可以访问媒体。这个解决方案对我有效


然而,这不是一个一刀切的食谱。请查看官方文档中的章节以获得更详细的信息。

Omg非常感谢。在我的应用程序中有相同的问题,但由于搜索错误的文件而未找到错误。