Запретить прямой доступ к загруженным файлам только неавторизованным пользователям - Symfony - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь предоставить прямой доступ к загруженным файлам только для зарегистрированных пользователей на моем веб-сайте из соображений безопасности.Я попробовал эту конфигурацию, но, похоже, она работает над загрузкой образа.

Это мой файл Twig с кодом , где я показываю изображение.

{% if(req.media!='') %}
      <a href="{% path req.media, 'reference' %}"
      data-fancybox class="fancybox">
       <img src="{% path (req.media), 'reference' %}" alt="" width="70px"
        height="70px"/>
      </a>
{% endif %}

Конфигурация для сонатных носителей ниже.

Sonata_media.yml

sonata_media:
# if you don't use default namespace configuration
#class:
#    media: MyVendor\MediaBundle\Entity\Media
#    gallery: MyVendor\MediaBundle\Entity\Gallery
#    gallery_has_media: MyVendor\MediaBundle\Entity\GalleryHasMedia
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr it is mandatory to choose one here
default_context: default # you need to set a context
contexts:
    default:  # the default context is mandatory
        download:
            strategy: sonata.media.security.forbidden_strategy
        providers:
            #- sonata.media.provider.dailymotion
            #- sonata.media.provider.youtube
            - sonata.media.provider.image
            - sonata.media.provider.file
            #- sonata.media.provider.vimeo

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я выполнил эти шаги, чтобы выполнить это требование.

  1. Создал функцию и добавил ее маршрут в брандмауэр, чтобы анонимные пользователи не могли перейти по этому пути.
  2. Создан маршрут кустановить его путь.
  3. Получил идентификатор носителя в функции и выполнил функцию для возврата файла.
  4. Вызвал функцию по пути с параметром mediaId вместо вызова прямого носителя в ветке.

Вот код.

security.yml

- { path: ^/user(.*), roles: ROLE_DASHBOARD_USER }

routing.yml

cms_direct_access_uploaded_files:
path:     /user/image-return/{fileId}
defaults: { _controller: CMSFrontUserBundle:Dashboard:DirectAccessUploadedMedia }

Контроллер

    public function DirectAccessUploadedMediaAction(Request $request,$fileId = null){
    $user = $this->getUser();
    if(!empty($user)){
        $DM = $this->getDoctrineManager();
        $media = $DM->getRepository('ApplicationSonataMediaBundle:Media')->find($fileId);
        if(!empty($media)) {
            $provider   = $this->container->get( $media->getProviderName() );
            $format     = $provider->getFormatName( $media, 'reference' );
            $url        = $provider->generatePublicUrl( $media, $format );
            $ext = pathinfo($url, PATHINFO_EXTENSION);
            $returnFile = $_SERVER['DOCUMENT_ROOT'] .'/web'. $url;
            if (file_exists($returnFile)) {
                if($ext == 'pdf'){
                    header("Content-Type: application/pdf");
                }else{
                    header("Content-Type: image/jpeg");
                }
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . filesize($returnFile));
                readfile($returnFile);
                exit;
            }
        }else{
            throw $this->createAccessDeniedException('Forbidden!');
        }
    }else{
        throw $this->createAccessDeniedException('Forbidden!');
    }
}

Веточка

{{ url('homepage') }}user/image-return/{{ req.media.id }}
0 голосов
/ 01 января 2019

Да, вы правы.Предоставленная вами ссылка содержит стратегию загрузки, но не содержит стратегию загрузки.Я также изучил документацию и предварительную настройку.

К сожалению, в документации нет упоминаний об этом.Ну, в этом случае вы должны написать свой собственный uploadStrategyInterface, такой как DownloadStrategyInterface.Затем напишите свою собственную стратегию загрузки безопасности или используйте «sonata.media.security.connected_strategy».Вот ссылка , которая поможет вам.

...