switchUser

Итак, согласно этой теме.
Выпускаю первую, пилотную версию компонента switchUser.
Как можно судить из названия, компонент предназначен для смены авторизованного пользователя.

Если быть немного подробнее, то можно менять пользователя из админки для web контекста.
Компонент расширяет контекстное меню в таблице юзеров.


При клике, открывает новое окно (необходимо разрешить всплывающие окна, браузер ругается) — главную страницу сайта (и там уже авторизован пользователь).

Выкладываю для тестирования, жду пожеланий по доработкам/багам.

Скачать транспортный пакет
Лев Вербицкий
09 декабря 2015, 15:51
modx.pro
2
2 566
+15

Комментарии: 13

Виталий
09 декабря 2015, 19:21
+2
Работает! Спасибо.

Выложишь в Магазин?
    Лев Вербицкий
    09 декабря 2015, 21:43
    +1
    Обязательно выложу, только доработаю немного) Надо добавить политики безопасности. И сделаю то, что предложил Коля.
    Василий Столейков
    09 декабря 2015, 19:53
    0
    Отличное решение!
    А есть ли возможность прикрутить это к фронтенду? Например в кастомной админке для менеджеров добавить кнопку, при нажатии на которую будут происходить точно такие же действия? Или это выбросит и текущего менеджера? Просто интересует, возможно ли как-то использовать это решение не только в админке?
      Лев Вербицкий
      09 декабря 2015, 21:44
      0
      Теоретически она есть, практически надо подумать) В базовом функционале менеджера выбросит текущего, возможно можно работать с разными контекстами попробовать. Сейчас пока авторизация идет только на web. Думаю введу системные настройки, что бы указывать в каких контекстах проводить авторизацию надо.
        Fi1osof
        09 декабря 2015, 22:34
        +1
        Надо будет просто посмотреть как у меня в CRM-ке сделано. Там же есть переключение пользователя, при этом не убивается текущая сессия пользователя.
      Fi1osof
      09 декабря 2015, 21:18
      +4
      Лёва, надо будет еще добавить очень полезную штуку — «Удалить сессию». Причем надо будет добавить еще возможность группового действия для этого. То есть мы поправили какие-то политики безопасности, знаем точно, что лучше всем операторам перелогиниться, и вот чтобы не слать им сообщения, просто устанавливаем фильтр по группе пользователей и выполняем массовое действие по удалению их сессий. sessionid в modUserProfile хранится.
      Так же это пригодится на сайтах с модерацией для точечного мгновенного обезвреживания врага :)
        Василий Наумкин
        09 декабря 2015, 21:57
        +2
        А стоит ли им прям сессии-то удалять? А вдруг там товары какие хранятся в корзине?

        Я обычно просто ставлю юзеру флажок в extended, который проверяется плагином на загрузку страницы. Как только зашел юзер с этим флажком — сессия ему аккуратно обновляется и флажок удаляется. Никто не страдает.
          Лев Вербицкий
          09 декабря 2015, 22:01
          0
          Ну как кастомный функционал, почему бы и нет) Бывают ситуации имхо, когда надо прямо жестко удалить все)
            Fi1osof
            09 декабря 2015, 22:02
            0
            Ну, у нас-то корзины в БД хранятся:) сброс сессии для авторизованного пользователя никак не повлияет на целостность его корзины. Но покажи код твоего плагина, что значит аккуратно обновляется? То есть хочется видеть как это у тебя реализовано.
            А про предложение механизма удаления сессий — иногда просто надо кому-то сессию убить. Ведь если ты блокируешь пользователя, его сессия при этом не завершается, и он может еще довольно долго на сайте авторизованным шастать.
              Василий Наумкин
              10 декабря 2015, 07:26
              8
              +5
              У меня на сайте, например, бывают платные разделы. Чтобы добавить пользователю доступ в них при оплате, работает вот такой плагин:
              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('/');
              	}
              }

              Если это всё не то — прошу прощения.
                Fi1osof
                10 декабря 2015, 09:39
                0
                Прощения-то совсем не за что просить))

                Для разлогинивания заблокированных пользователей использую вот такой код в том же плагине:
                Вот это хорошо тем, что практически исключает человеческий фактор (снял активность — больше врагу не пройти). Но смущает то, что оно будет вызываться при каждом заходе на страницу. Я в этом плане немного перфекционист, не очень люблю, когда что-то работает много без надобности. А так очень даже рабочий вариант.

                С обновлением групп симпатичненько :)

                P.S. Вопрос: часто у тебя вижу подобное:
                $ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
                Чем тебя смущает такая конструкция?
                $ctxQuery->select(array('key'));
                Одним методом меньше.
                  Василий Наумкин
                  10 декабря 2015, 09:43
                  0
                  Ничем, просто так привык, когда только учился.

                  Сейчас стараюсь писать попроще, но еще много подобного можно найти в разных разработках.
                    Fi1osof
                    10 декабря 2015, 09:44
                    0
                    Ясно. ОК.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13