[switchUser] Версия 1.1.0
Вчера по просьбе сообщества я разработал компонент switchUser.
Сегодня произошли некоторые доработки компонента, которые потребовали отдельной статьи.
В новой версии появилась возможность работать напрямую с фронтенда.

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

Соответственно, после нажатия кнопки «Авторизоваться» происходит возврат на предыдущую страницу, но уже под другим пользователем.

Далее немного технических подробностей.
Была добавлена проверка политики доступа. Для удобства пользования и что бы не плодить лишние политики было решено проверять «save_user», так как это одна из самых привилегированных политик (если пользователь может дать себе sudo, то его уже ничего не остановит =)).
Что бы это сделать, пришлось применить вот такую вот конструкцию:
Вся логика была вынесена в плагин, использование процессора больше не требуется.
Времени на разработку компонента ушло прилично, так что компонент платный.
Компонент в modstore
Сегодня произошли некоторые доработки компонента, которые потребовали отдельной статьи.
В новой версии появилась возможность работать напрямую с фронтенда.
Вот такая вот милая кнопочка, которая при нажатии редиректит в админку на страницу пользователей.
При редиректе берется текущий url страницы, для последующего возврата на нее.
Соответственно, после нажатия кнопки «Авторизоваться» происходит возврат на предыдущую страницу, но уже под другим пользователем.
Далее немного технических подробностей.
Была добавлена проверка политики доступа. Для удобства пользования и что бы не плодить лишние политики было решено проверять «save_user», так как это одна из самых привилегированных политик (если пользователь может дать себе sudo, то его уже ничего не остановит =)).
Что бы это сделать, пришлось применить вот такую вот конструкцию:
$ctx = $modx->context->key;
case 'OnWebPageInit':
$modx->switchContext('mgr');
if ($modx->hasPermission('save_user')){
$modx->switchContext($ctx);
...В контексте mgr у нас авторизован администратор, все остальные действия мы проводим для фронтового контекста. В противном случае, без данной конструкции, с фронтенда проверить права будет невозможно.Вся логика была вынесена в плагин, использование процессора больше не требуется.
Времени на разработку компонента ушло прилично, так что компонент платный.
Компонент в modstore
Комментарии: 14
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Николай, поскольку я на все 100% согласен с твоей фразой в твоем недавнем топике —
— я именно так и делаю. У всех моих проектов на modx права к контексту mgr имеет только один пользователь. И это либо я, если проект остаётся у меня на поддержке, либо кто-то из специалистов заказчика. Весь контент же управляется с фронтенда и для этого доступ в админку никому не нужен.
Для одного из проектов на поддержке меня попросили сделать возможность просматривать сайт под любым пользователем, не зная его пароля. Это необходимо для службы технической поддержки заказчика. Я уже хотел было бежать покупать твой компонент, но почитал немного внимательнее описание и понял, что он в своей работе использует как раз доступ в mgr контекст.
Подскажи, пожалуйста, возможно ли использование компонента без предоставления пользователям прав на доступ в админку?
Заранее благодарю за ответ.
Fi1osofПо твоей задаче: для того, чтобы без лишних танцев с бубнами, была корректная проверка на переключение пользователей, надо все-таки, чтобы пользователь имел авторизацию сразу в двух контекстах. Не думаю, что в ядре компонента этот механизм поменяется, но за +1000 к купленному компоненту я подправлю его на твоем сайте под твои нужды, чтобы он не использовал mgr-контекст.
Не подумай, что пожалел денег, но я не имею права допустить в админку посторонних:))
Fi1osofШутка на злобу дня :)
Если сможешь модифицировать, может и покупать тогда не надо, если на это хватает знаний. Если вдруг не хватит, то можно подправить с ошибками, а с безопасностью шутки плохи. Ну да ладно, это уже тебе решать.
Я не напрашиваюсь, но все-таки это дело такое.
Давай так. Я на следующей неделе этим смогу заняться, куплю компонент и посмотрю код. Если возникнут сомнения, я обращусь и договоримся о стоимости.
В любом случае спасибо за предложение!
Fi1osofПодсказываю вариант: создаешь еще один контекст без всяких документов, прав и т.п. Вешаешь плагин на авторизацию веб-пользователя. Если пользователь такой, который должен иметь права на переключение, его в плагине делаешь $modx->addSessionContext($ctx), то есть дополнительно авторизуешь его в этот спецконтекст. А плагин switchUser модифицируешь на проверку авторизован в этом контексте или нет, там посмотришь. Только там еще на контексте проверка есть на право user_save, вот это можешь убрать. Если ты никого в этот контекст не будешь авторизовывать, то дополнительные проверки не потребуются (во всяком случае, если это не публичный компонент). или можешь добавить допправа на этот контекст и их дополнительно проверять.
Fi1osofЕсли switchUser, то отвечу, что пока он этого не умеет делать, к сожалению. Может позже добавлю эту функцию. Пока же можете сделать копию текущего плагина, старый отключить, а в новом перечислить нужные контексты в конструкции $modx->user->addSessionContext($modx->context->key); типа
$modx->user->addSessionContext('web');
$modx->user->addSessionContext('web2');
$modx->user->addSessionContext('web3');
Если контекстов много, то конечно же можно получить список контекстов запросом.
Fi1osofМаксим ниже показал как.
меняем строку (в двух местах)
на следующую