代码之家  ›  专栏  ›  技术社区  ›  cezar Dennis Kioko

拒绝访问SonatameDiabundle和Symfony 4中的查看和下载路径

  •  2
  • cezar Dennis Kioko  · 技术社区  · 6 年前

    我将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 回复  |  直到 6 年前
        1
  •  2
  •   cezar Dennis Kioko    6 年前

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

    正如我在问题中提到的,这些例外情况来自:

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

    在方法中 downloadAction viewAction . 条件如下:

    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
    

    声明的路径 纽约证券交易所 现在覆盖 media 角色扮演者 角色\超级\管理员 可以访问路由。

    缺点:如果你想在管理员之外公开媒体怎么办?如果其他角色能够访问它们呢?

    2)在中声明新路径 纽约证券交易所 :

    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 从官方文件中获取更详细的信息。