EasyAdmin 3 - Выдача себя за пользователя на панели управления

Я пытался использовать easyAdmin3 для быстрого создания учетной записи администратора, но как сделать правильное действие, имитирующее пользователя?

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

Impersonate работает, но только на странице, на которую ссылается url (олицетворение остановлено, если страница изменяется), а User not change в панели инструментов Symfony ...

Мое собственное действие:

    public function configureActions(Actions $actions): Actions
    {
        $impersonate = Action::new('impersonate', 'Impersonate')
            ->linkToRoute('web_account_index', function (User $entity) {
               return [
                    'id' => $entity->getId(),
                   '?_switch_user' => $entity->getEmail()
               ];
            })
        ;
        return parent::configureActions($actions)
            ->add(Crud::PAGE_INDEX, Action::DETAIL)
            ->add(Crud::PAGE_INDEX, $impersonate)
            ;
    }

Результат: ссылка на панель управления для каждого пользователя

После нажатия на олицетворение у меня есть этот URL:

https://blog-community.wip/account/7?eaContext=37a8719&[email protected]

Контент в порядке (учетная запись страницы для пользователя 7), но в Symfony Profiler отображается User admin вместо олицетворенного пользователя:

Пользователь профилировщика Symfony вошел в систему

Изменить выход со страницы олицетворением ...

Настоящее олицетворение Symfony сохраняет олицетворение, даже если страница изменяется, потому что зарегистрированные пользователи профилировщика разные Пользователь профилировщика Symfony вошел в систему под олицетворением напрямую в URL

документация не ссылается на эту функциональность, Github EasyAdmin также имеет проблемы с этим веб-сайтом.

Спасибо за помощь


person Grandpere    schedule 16.07.2020    source источник


Ответы (3)


Для EasyAdmin 3.2.x предыдущее решение перестало работать. Теперь это работает для меня:

public function configureActions(Actions $actions): Actions
{
    $impersonate = Action::new('impersonate', false, 'fa fa-fw fa-user-lock')
        //changed from linkToRoute to linkToUrl. note that linkToUrl has only one parameter.
        //"admin/.. can be adjusted to another URL"
        ->linkToUrl(function (User $entity) {
            return 'admin/?_switch_user='.$entity->getUsername();
        })
    ;

    $actions = parent::configureActions($actions);
    $actions->add(Crud::PAGE_INDEX, $impersonate);

    return $actions;
}
person mvetter    schedule 10.01.2021

Решено!

EasyAdmin автоматически добавляет некоторые параметры в URL-адрес, так? уже здесь, но я тоже добавил это в свое настраиваемое действие ...

Пример :

https://blog-community.wip/account/7?eaContext=37a8719&[email protected]
    public function configureActions(Actions $actions): Actions
    {
        $impersonate = Action::new('impersonate', 'Impersonate')
            ->linkToRoute('web_account_index', function (User $entity) {
               return [
                    'id' => $entity->getId(),
                   '_switch_user' => $entity->getEmail() 
                   // removed ? before _switch_user
               ];
            })
        ;
        return parent::configureActions($actions)
            ->add(Crud::PAGE_INDEX, Action::DETAIL)
            ->add(Crud::PAGE_INDEX, $impersonate)
            ;
    }
person Grandpere    schedule 17.07.2020
comment
Из любопытства: зачем вы вообще вставили туда ?? - person Nico Haase; 17.07.2020
comment
Я забыл, что Symfony добавляет ? автоматически, если параметр не ожидается в маршруте, я хотел создать URL вручную, но это глупо ^^ ' - person Grandpere; 17.07.2020

Я не большой поклонник жестко запрограммированных правил, поэтому внедрил UrlGenerator в свой CrudController:

$impersonate = Action::new('impersonate', 'Impersonate')
    ->linkToUrl(function (User $user): string {
        return $this->urlGenerator->generate(
            Routes::DASHBOARD,
            ['_switch_user' => $user->getEmail()],
            UrlGeneratorInterface::ABSOLUTE_URL
        );
    });
person OskarStark    schedule 23.06.2021