Как сделать пользовательское действие недоступным в зависимости от пользователя - Sonata Admin

Я реализовал действие клонирования, как в документации. Как ограничить доступ к действию клонирования пользователю, создавшему объект?

В моем действии уже есть проверка исключения отказа в доступе, но как теперь я могу скрыть кнопку в представлении списка, если пользователь не является автором этого объекта. Пользователь по-прежнему должен иметь возможность перечислить заказ и отобразить его.

Это мой маршрут:

protected function configureRoutes(RouteCollection $collection)
{
    $collection->add('clone', $this->getRouterIdParameter().'/clone'); 
}

И мои поля списка:

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('_action', 'actions', array(
            'actions' => array(
                'show' => array(),
                'edit' => array(),
                'clone' => array(
                    'template' => 'AppBundle:Sonata/Button:clone_button.html.twig'
                ),
            ), 'label' => 'Actions'
        ))
    ;
}

и мое действие клона:

public function cloneAction($id = null)
{
    $object = $this->admin->getSubject();
    if (!$object) {
        throw new NotFoundHttpException(sprintf('Unable to find the object with id : %s', $id));
    }

    If (!$object->isAuthor($this->getUser())) {
        throw new AccessDeniedException();
    }

    $clonedObject = clone $object;

    $this->admin->create($clonedObject);
    $this->addFlash('sonata_flash_success', 'Cloned successfully');
    return new RedirectResponse($this->admin->generateUrl('edit', array('id' => $clonedObject->getId())));
}

Как вы можете видеть в моем действии клонирования, у меня есть проверка, чтобы убедиться, что пользователь является автором заказа. Но как я могу полностью удалить кнопку из списка, проверив мою функцию isAuthor?

Потому что теперь пользователь может видеть кнопку, но если он не авторизован для клонирования заказа и нажимает кнопку, он получает исключение с отказом в доступе. Поэтому я вообще не хочу показывать кнопку. То же самое относится и к кнопке редактирования.

Я подумал о чем-то вроде этого:

protected function configureRoutes(RouteCollection $collection)
{
    $user = $this->getConfigurationPool()->getContainer()->get('security.token_storage')
            ->getToken()->getUser();

    If (!$object->isAuthor($user)) {
        $collection->remove('edit');
        $collection->remove('clone');
    }
}

Но видимо этого делать нельзя.

Кто-нибудь знает, как это сделать?


person Jack Coolen    schedule 28.11.2016    source источник


Ответы (1)


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

Кроме того, совет не по теме, всегда указывайте сообщение внутри ваших исключений.

throw new AccessDeniedException('Not an author of this object');
person greg0ire    schedule 28.11.2016
comment
Хорошо, это сделает некоторые вещи, которые я должен сделать, действительно проще. Но теперь остается вопрос, как я могу скрыть маршрут, если у пользователя нет доступа? Кнопка останется там, и если кто-то нажмет на нее, будет выдано исключение. Я хочу, чтобы кнопка отображалась только в том случае, если пользователь может ее использовать. Это легко сделать, если я работаю с чистой Symfony. Но теперь я использую Sonata с ним. - person Jack Coolen; 29.11.2016
comment
Проверьте шаблон, но, как я уже сказал, в нем наверняка уже есть проверка? Или, может быть, вы сами написали шаблон? Он должен использовать is_granted() с маршрутом и объектом, и это вызовет избиратель. - person greg0ire; 29.11.2016
comment
Итак, шаг 0, если вы хотите решить эту проблему, — найти и показать нам шаблон для кнопки. - person greg0ire; 29.11.2016
comment
Я проверил шаблоны для кнопок редактирования и создания и увидел, что они действительно имеют is_granted(), поэтому я также добавил эту проверку в свое действие клонирования и изменил его по своему усмотрению. Это все хорошо знать. Я теперь тоже понимаю, как это работает. Спасибо. - person Jack Coolen; 29.11.2016
comment
Рад узнать, что ты это сделал. Подумайте о том, чтобы внести что-то в документы, если вы чувствуете, что это должно где-то появиться. - person greg0ire; 29.11.2016