switchUser
Итак, согласно этой теме.
Выпускаю первую, пилотную версию компонента switchUser.
Как можно судить из названия, компонент предназначен для смены авторизованного пользователя.
Если быть немного подробнее, то можно менять пользователя из админки для web контекста.
Компонент расширяет контекстное меню в таблице юзеров.
При клике, открывает новое окно (необходимо разрешить всплывающие окна, браузер ругается) — главную страницу сайта (и там уже авторизован пользователь).
Выкладываю для тестирования, жду пожеланий по доработкам/багам.
Скачать транспортный пакет
Выпускаю первую, пилотную версию компонента switchUser.
Как можно судить из названия, компонент предназначен для смены авторизованного пользователя.
Если быть немного подробнее, то можно менять пользователя из админки для web контекста.
Компонент расширяет контекстное меню в таблице юзеров.
При клике, открывает новое окно (необходимо разрешить всплывающие окна, браузер ругается) — главную страницу сайта (и там уже авторизован пользователь).
Выкладываю для тестирования, жду пожеланий по доработкам/багам.
Скачать транспортный пакет
Комментарии: 13
Работает! Спасибо.
Выложишь в Магазин?
Выложишь в Магазин?
Обязательно выложу, только доработаю немного) Надо добавить политики безопасности. И сделаю то, что предложил Коля.
Отличное решение!
А есть ли возможность прикрутить это к фронтенду? Например в кастомной админке для менеджеров добавить кнопку, при нажатии на которую будут происходить точно такие же действия? Или это выбросит и текущего менеджера? Просто интересует, возможно ли как-то использовать это решение не только в админке?
А есть ли возможность прикрутить это к фронтенду? Например в кастомной админке для менеджеров добавить кнопку, при нажатии на которую будут происходить точно такие же действия? Или это выбросит и текущего менеджера? Просто интересует, возможно ли как-то использовать это решение не только в админке?
Теоретически она есть, практически надо подумать) В базовом функционале менеджера выбросит текущего, возможно можно работать с разными контекстами попробовать. Сейчас пока авторизация идет только на web. Думаю введу системные настройки, что бы указывать в каких контекстах проводить авторизацию надо.
Надо будет просто посмотреть как у меня в CRM-ке сделано. Там же есть переключение пользователя, при этом не убивается текущая сессия пользователя.
Лёва, надо будет еще добавить очень полезную штуку — «Удалить сессию». Причем надо будет добавить еще возможность группового действия для этого. То есть мы поправили какие-то политики безопасности, знаем точно, что лучше всем операторам перелогиниться, и вот чтобы не слать им сообщения, просто устанавливаем фильтр по группе пользователей и выполняем массовое действие по удалению их сессий. sessionid в modUserProfile хранится.
Так же это пригодится на сайтах с модерацией для точечного мгновенного обезвреживания врага :)
Так же это пригодится на сайтах с модерацией для точечного мгновенного обезвреживания врага :)
А стоит ли им прям сессии-то удалять? А вдруг там товары какие хранятся в корзине?
Я обычно просто ставлю юзеру флажок в extended, который проверяется плагином на загрузку страницы. Как только зашел юзер с этим флажком — сессия ему аккуратно обновляется и флажок удаляется. Никто не страдает.
Я обычно просто ставлю юзеру флажок в extended, который проверяется плагином на загрузку страницы. Как только зашел юзер с этим флажком — сессия ему аккуратно обновляется и флажок удаляется. Никто не страдает.
Ну как кастомный функционал, почему бы и нет) Бывают ситуации имхо, когда надо прямо жестко удалить все)
Ну, у нас-то корзины в БД хранятся:) сброс сессии для авторизованного пользователя никак не повлияет на целостность его корзины. Но покажи код твоего плагина, что значит аккуратно обновляется? То есть хочется видеть как это у тебя реализовано.
А про предложение механизма удаления сессий — иногда просто надо кому-то сессию убить. Ведь если ты блокируешь пользователя, его сессия при этом не завершается, и он может еще довольно долго на сайте авторизованным шастать.
А про предложение механизма удаления сессий — иногда просто надо кому-то сессию убить. Ведь если ты блокируешь пользователя, его сессия при этом не завершается, и он может еще довольно долго на сайте авторизованным шастать.
У меня на сайте, например, бывают платные разделы. Чтобы добавить пользователю доступ в них при оплате, работает вот такой плагин:
Для разлогинивания заблокированных пользователей использую вот такой код в том же плагине:
Если это всё не то — прошу прощения.
case 'OnWebPageInit':
if ($uid = $modx->user->id) {
if ($extended = $modx->user->Profile->get('extended')) {
if (!empty($extended['updateGroups'])) {
unset($_SESSION['modx.user.'.$modx->user->id.'.userGroupNames']);
$extended['updateGroups'] = 0;
$modx->user->Profile->set('extended', $extended);
$modx->user->Profile->save();
$ctxQuery = $modx->newQuery('modContext');
$ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
if ($ctxQuery->prepare() && $ctxQuery->stmt->execute()) {
if ($contexts = $ctxQuery->stmt->fetchAll(PDO::FETCH_COLUMN)) {
$serialized = serialize($contexts);
$modx->exec("UPDATE {$modx->getTableName('modUser')} SET {$modx->escape('session_stale')} = {$modx->quote($serialized)}");
}
}
}
}
}
break;
Написан давно, работает без нареканий.Для разлогинивания заблокированных пользователей использую вот такой код в том же плагине:
if ($modx->user->id) {
if (!$modx->user->active || $modx->user->Profile->blocked) {
$modx->runProcessor('security/logout');
$modx->sendRedirect('/');
}
}
Если это всё не то — прошу прощения.
Прощения-то совсем не за что просить))
С обновлением групп симпатичненько :)
P.S. Вопрос: часто у тебя вижу подобное:
Для разлогинивания заблокированных пользователей использую вот такой код в том же плагине:Вот это хорошо тем, что практически исключает человеческий фактор (снял активность — больше врагу не пройти). Но смущает то, что оно будет вызываться при каждом заходе на страницу. Я в этом плане немного перфекционист, не очень люблю, когда что-то работает много без надобности. А так очень даже рабочий вариант.
С обновлением групп симпатичненько :)
P.S. Вопрос: часто у тебя вижу подобное:
$ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
Чем тебя смущает такая конструкция?$ctxQuery->select(array('key'));
Одним методом меньше.
Ничем, просто так привык, когда только учился.
Сейчас стараюсь писать попроще, но еще много подобного можно найти в разных разработках.
Сейчас стараюсь писать попроще, но еще много подобного можно найти в разных разработках.
Ясно. ОК.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.