Ограничьте действия для некоторых пользователей с Sonata с помощью собственной стратегии - PullRequest
0 голосов
/ 27 марта 2019

Я хотел бы удалить некоторые действия, такие как «УДАЛИТЬ», с формами, когда текущий пользователь не является владельцем текущего объекта, но имеет роль ADMIN для его редактирования.

Я хотел бы применить этоповедение списков (флажков) или при редактировании объектов.

В настоящее время я использую избирателя, которого я использую в классе администратора, например:

protected function configureFormFields(FormMapper $formMapper){
        if($this->isCurrentRoute('edit') && !$this->getConfigurationPool()->getContainer()->get('security.authorization_checker')->isGranted('edit', $this->getSubject()))
            throw new AccessDeniedHttpException();
...
}

Где я проверяю с помощью своей собственной логики.Но я не знаю, как я могу использовать своего избирателя для удаления действия удаления.

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

1 Ответ

0 голосов
/ 30 марта 2019

Мне наконец удалось, но я не уверен, что это лучшее решение.

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

class ProjectAdmin extends AbstractAdmin
{
...
public function getTemplate($name)
    {
        switch ($name) {
            case 'edit':
                return 'Sonata/ProjectAdmin/edit.html.twig';
                break;
            default:
                return parent::getTemplate($name);
                break;
        }
    }
...
}

Я создал свой шаблон в templates/Sonata/ProjectAdmin/edit.html.twig

содержит:

{% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %}

{% use 'SonataExtends/base_edit_form.html.twig' with form as parentForm %}

{% block form %}
    {{ block('parentForm') }}
{% endblock %}

Затем я скопировал / вставил vendor/sonata-project/admin-bundle/src/Ressources/views/CRUD/base_edit_form.html.twig в templates/SonataExtends/base_edit_form.html.twig

Я заменил блок:

 {% if admin.hasRoute('delete') and admin.hasAccess('delete', object) %}
    {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
    <a class="btn btn-danger" href="{{ admin.generateObjectUrl('delete', object) }}">
    <i class="fa fa-minus-circle" aria-hidden="true"></i> {{ 'link_delete'|trans({}, 'SonataAdminBundle') }}</a>
{% endif %}

для вызова моего избирателя:

 {% if admin.hasRoute('delete') and is_granted('delete', object) %}
     {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
     <a class="btn btn-danger" href="{{ admin.generateObjectUrl('delete', object) }}">
     <i class="fa fa-minus-circle" aria-hidden="true"></i> {{ 'link_delete'|trans({}, 'SonataAdminBundle') }}</a>
{% endif %}

Единственная разница is_granted('delete', object) вместо admin.hasAccess('delete', object)

Как я уже сказал, это может быть не лучшим способом продолжить, поэтому спасибо, что поправили меня. Но мне не удалось переопределить логику admin.hasAccess («удалить», объект). Для других административных классов мне нужно только использовать мою функцию getTemplate для использования этой логики.

PS: Я также добавил этот код в свой класс администратора для управления действием удаления:

 public function preRemove($project){
        if (false === $this->getConfigurationPool()->getContainer()->get('security.authorization_checker')->isGranted('delete', $project)) {
            throw new AccessDeniedHttpException();
        }
    }
...