Sonata Media — пользовательская стратегия загрузки

У меня есть объект с именем «Document», и я использую сонаты для управления файлами. Таким образом, администратор может добавить новый документ и прикрепить файл, этот документ назначается пользователю.

Моя проблема:
Я хочу, чтобы пользователи могли загружать файлы, которые им назначены через «Защищенный URL» (потому что, если вы измените номер в конце URL-адреса загрузки, вы сможете загружать файлы, которые назначены другим пользователям)

Согласно документу Sonata Media, мне нужно создать стратегию загрузки и сервис. Я сделал это, я назвал это: PrivateDownloadStrategy.php (и сделал сервис)
Этот файл должен быть основан на RolesDownloadStrategy.php, потому что я хочу, чтобы администраторы могли загружать все файлы, но как сделать, чтобы пользователи могли загружать файлы, которые им назначены?

Это мой фактический PrivateDownloadStrategy.php (копия из roleDownloadStrategy.php)

<?php
namespace Application\Core\DocumentBundle\Security;

use Sonata\MediaBundle\Security\DownloadStrategyInterface;
use Sonata\MediaBundle\Model\MediaInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class PrivateDownloadStrategy implements DownloadStrategyInterface
{
protected $roles;

protected $security;

protected $translator;

/**
* @param \Symfony\Component\Translation\TranslatorInterface        $translator
* @param \Symfony\Component\Security\Core\SecurityContextInterface $security
* @param array                                                     $roles
*/
public function __construct(TranslatorInterface $translator, SecurityContextInterface $security, array $roles = array())
{
$this->roles      = $roles;
$this->security   = $security;
$this->translator = $translator;
}

/**
* @param \Sonata\MediaBundle\Model\MediaInterface  $media
* @param \Symfony\Component\HttpFoundation\Request $request
*
* @return bool
*/
public function isGranted(MediaInterface $media, Request $request)
{
return $this->security->getToken() && $this->security->isGranted($this->roles);
}

/**
* @return string
*/
public function getDescription()
{
return $this->translator->trans('description.roles_download_strategy', array('%roles%' => '<code>'.implode('</code>, <code>', $this->roles).'</code>'), 'SonataMediaBundle');
}
}

и сервис:

<service id="sonata.media.security.private_strategy" class="Application\Core\DocumentBundle\Security\PrivateDownloadStrategy" >
<argument type="service" id="translator" />
<argument type="service" id="security.context" />
<argument type="collection">
<argument>ROLE_SUPER_ADMIN</argument>
<argument>ROLE_ADMIN</argument>
</argument>
</service>

нб: соната медиа док: ссылка на сайт
Роли сонатыDownloadStrategy: ссылка на сайт

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]