【问题标题】:Access Denied for view and download routes in SonataMediaBundle and Symfony 4在 SonataMediaBundle 和 Symfony 4 中查看和下载路由的访问被拒绝
【发布时间】:2019-03-26 11:03:17
【问题描述】:

我使用 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。我在源代码中四处挖掘,但找不到引发异常的原因。

【问题讨论】:

    标签: symfony symfony4 sonata-media-bundle symfony-routing


    【解决方案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] }
        # ...
    

    现在每个登录用户都可以访问媒体。这个解决方案对我有用。

    然而,这不是一个万能的食谱。请查看官方文档中的security章节以获取更多详细信息。

    【讨论】:

    • 天哪,非常感谢。在我的应用程序中遇到了同样的问题,但由于在错误的文件中搜索而没有发现错误。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2014-03-19
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-11-11
    相关资源
    最近更新 更多