[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
UPD. Компонент прошел модерацию. Ссылку в топик добавил.
Можно ли создавать тикеты от имени другого пользователя, используя ваше дополнение? Или оно исключительно для просмотра
Оно для всех действий, которые может выполнить пользователь на фронте.
Заранее извиняюсь за некропостинг, но вопрос напрямую касается компонента.
Николай, поскольку я на все 100% согласен с твоей фразой в твоем недавнем топике —
Для одного из проектов на поддержке меня попросили сделать возможность просматривать сайт под любым пользователем, не зная его пароля. Это необходимо для службы технической поддержки заказчика. Я уже хотел было бежать покупать твой компонент, но почитал немного внимательнее описание и понял, что он в своей работе использует как раз доступ в mgr контекст.
Подскажи, пожалуйста, возможно ли использование компонента без предоставления пользователям прав на доступ в админку?
Заранее благодарю за ответ.
Николай, поскольку я на все 100% согласен с твоей фразой в твоем недавнем топике —
P.S. И еще заповедь: не пускайте никого в админку, даже с самыми минимальными правами. Это практически 100% гарантия взлома при желании.— я именно так и делаю. У всех моих проектов на modx права к контексту mgr имеет только один пользователь. И это либо я, если проект остаётся у меня на поддержке, либо кто-то из специалистов заказчика. Весь контент же управляется с фронтенда и для этого доступ в админку никому не нужен.
Для одного из проектов на поддержке меня попросили сделать возможность просматривать сайт под любым пользователем, не зная его пароля. Это необходимо для службы технической поддержки заказчика. Я уже хотел было бежать покупать твой компонент, но почитал немного внимательнее описание и понял, что он в своей работе использует как раз доступ в mgr контекст.
Подскажи, пожалуйста, возможно ли использование компонента без предоставления пользователям прав на доступ в админку?
Заранее благодарю за ответ.
Есть у меня один клиент крупный (колл-центр), там там довольно много пользователей и групп пользователей, и нужна была возможность без всяких переключений в контекстах делать выборки от разных пользователей, чтобы видеть, какие данные им будут предоставлены. Делалось это вот так:) joxi.ru/v29QeZnHGVj4x2
По твоей задаче: для того, чтобы без лишних танцев с бубнами, была корректная проверка на переключение пользователей, надо все-таки, чтобы пользователь имел авторизацию сразу в двух контекстах. Не думаю, что в ядре компонента этот механизм поменяется, но за +1000 к купленному компоненту я подправлю его на твоем сайте под твои нужды, чтобы он не использовал mgr-контекст.
По твоей задаче: для того, чтобы без лишних танцев с бубнами, была корректная проверка на переключение пользователей, надо все-таки, чтобы пользователь имел авторизацию сразу в двух контекстах. Не думаю, что в ядре компонента этот механизм поменяется, но за +1000 к купленному компоненту я подправлю его на твоем сайте под твои нужды, чтобы он не использовал mgr-контекст.
Спасибо! Подправить, полагаю, смогу. Только вот с обновлениями придется возиться. Или не обновлять:))
Не подумай, что пожалел денег, но я не имею права допустить в админку посторонних:))
Не подумай, что пожалел денег, но я не имею права допустить в админку посторонних:))
Не пускай. Дай ссылку на сайт, я сам зайду)))
Шутка на злобу дня :)
Если сможешь модифицировать, может и покупать тогда не надо, если на это хватает знаний. Если вдруг не хватит, то можно подправить с ошибками, а с безопасностью шутки плохи. Ну да ладно, это уже тебе решать.
Я не напрашиваюсь, но все-таки это дело такое.
Шутка на злобу дня :)
Если сможешь модифицировать, может и покупать тогда не надо, если на это хватает знаний. Если вдруг не хватит, то можно подправить с ошибками, а с безопасностью шутки плохи. Ну да ладно, это уже тебе решать.
Я не напрашиваюсь, но все-таки это дело такое.
Не пускай. Дай ссылку на сайт, я сам зайду)))Да уж… Жесть как она есть:))
Шутка на злобу дня :)
Давай так. Я на следующей неделе этим смогу заняться, куплю компонент и посмотрю код. Если возникнут сомнения, я обращусь и договоримся о стоимости.
В любом случае спасибо за предложение!
ОК.
Подсказываю вариант: создаешь еще один контекст без всяких документов, прав и т.п. Вешаешь плагин на авторизацию веб-пользователя. Если пользователь такой, который должен иметь права на переключение, его в плагине делаешь $modx->addSessionContext($ctx), то есть дополнительно авторизуешь его в этот спецконтекст. А плагин switchUser модифицируешь на проверку авторизован в этом контексте или нет, там посмотришь. Только там еще на контексте проверка есть на право user_save, вот это можешь убрать. Если ты никого в этот контекст не будешь авторизовывать, то дополнительные проверки не потребуются (во всяком случае, если это не публичный компонент). или можешь добавить допправа на этот контекст и их дополнительно проверять.
Подсказываю вариант: создаешь еще один контекст без всяких документов, прав и т.п. Вешаешь плагин на авторизацию веб-пользователя. Если пользователь такой, который должен иметь права на переключение, его в плагине делаешь $modx->addSessionContext($ctx), то есть дополнительно авторизуешь его в этот спецконтекст. А плагин switchUser модифицируешь на проверку авторизован в этом контексте или нет, там посмотришь. Только там еще на контексте проверка есть на право user_save, вот это можешь убрать. Если ты никого в этот контекст не будешь авторизовывать, то дополнительные проверки не потребуются (во всяком случае, если это не публичный компонент). или можешь добавить допправа на этот контекст и их дополнительно проверять.
Подскажите, Николай. Как авторизоваться не только в текущем контексте, но и во всех дополнительных?
Уточните, вы спрашиваете как это сделать средствами switchUser? Или в принципе?
Если switchUser, то отвечу, что пока он этого не умеет делать, к сожалению. Может позже добавлю эту функцию. Пока же можете сделать копию текущего плагина, старый отключить, а в новом перечислить нужные контексты в конструкции $modx->user->addSessionContext($modx->context->key); типа
$modx->user->addSessionContext('web');
$modx->user->addSessionContext('web2');
$modx->user->addSessionContext('web3');
Если контекстов много, то конечно же можно получить список контекстов запросом.
Если switchUser, то отвечу, что пока он этого не умеет делать, к сожалению. Может позже добавлю эту функцию. Пока же можете сделать копию текущего плагина, старый отключить, а в новом перечислить нужные контексты в конструкции $modx->user->addSessionContext($modx->context->key); типа
$modx->user->addSessionContext('web');
$modx->user->addSessionContext('web2');
$modx->user->addSessionContext('web3');
Если контекстов много, то конечно же можно получить список контекстов запросом.
Спасибо. И на 18 и на 51 строках плагина менять?
Не за что.
Максим ниже показал как.
Максим ниже показал как.
Лучше сделать так (в плагине):
меняем строку (в двух местах)
на следующую
меняем строку (в двух местах)
$modx->user->addSessionContext($modx->context->key);
на следующую
$contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
foreach($contexts as $context) {
$modx->user->addSessionContext($context->key);
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.