繁体   English   中英

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

[英]Access Denied for view and download routes in SonataMediaBundle and Symfony 4

我使用带有 SonataAdminBundle 和 SonataMediaBundle 的 Symfony 4(更精确的 4.1)。

这是我的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中的downloadActionviewAction 我在源代码中挖掘,但找不到抛出异常的原因。

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

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

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

在方法downloadActionviewAction 它是以下 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_ADMINROLE_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声明的路径现在覆盖了mediaROLE_ADMINROLE_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] }
    # ...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM