У меня есть объект с именем «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: ссылка на сайт
Задача ещё не решена.
Других решений пока нет …