[switchUser] Версия 1.1.0

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

В новой версии появилась возможность работать напрямую с фронтенда.


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


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



Далее немного технических подробностей.
Была добавлена проверка политики доступа. Для удобства пользования и что бы не плодить лишние политики было решено проверять «save_user», так как это одна из самых привилегированных политик (если пользователь может дать себе sudo, то его уже ничего не остановит =)).
Что бы это сделать, пришлось применить вот такую вот конструкцию:
$ctx = $modx->context->key;
case 'OnWebPageInit':
        $modx->switchContext('mgr');
        if ($modx->hasPermission('save_user')){
            $modx->switchContext($ctx);
	    ...
В контексте mgr у нас авторизован администратор, все остальные действия мы проводим для фронтового контекста. В противном случае, без данной конструкции, с фронтенда проверить права будет невозможно.

Вся логика была вынесена в плагин, использование процессора больше не требуется.

Времени на разработку компонента ушло прилично, так что компонент платный.
Компонент в modstore
Лев Вербицкий
10 декабря 2015, 17:02
modx.pro
3
2 462
+9

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

Лев Вербицкий
10 декабря 2015, 22:35
+1
UPD. Компонент прошел модерацию. Ссылку в топик добавил.
    Николаевич
    07 июля 2016, 12:29
    0
    Можно ли создавать тикеты от имени другого пользователя, используя ваше дополнение? Или оно исключительно для просмотра
      Воеводский Михаил
      07 июля 2016, 13:05
      +1
      Оно для всех действий, которые может выполнить пользователь на фронте.
      Антон Фомичёв
      05 ноября 2016, 12:48
      +1
      Заранее извиняюсь за некропостинг, но вопрос напрямую касается компонента.
      Николай, поскольку я на все 100% согласен с твоей фразой в твоем недавнем топике —
      P.S. И еще заповедь: не пускайте никого в админку, даже с самыми минимальными правами. Это практически 100% гарантия взлома при желании.
      — я именно так и делаю. У всех моих проектов на modx права к контексту mgr имеет только один пользователь. И это либо я, если проект остаётся у меня на поддержке, либо кто-то из специалистов заказчика. Весь контент же управляется с фронтенда и для этого доступ в админку никому не нужен.
      Для одного из проектов на поддержке меня попросили сделать возможность просматривать сайт под любым пользователем, не зная его пароля. Это необходимо для службы технической поддержки заказчика. Я уже хотел было бежать покупать твой компонент, но почитал немного внимательнее описание и понял, что он в своей работе использует как раз доступ в mgr контекст.
      Подскажи, пожалуйста, возможно ли использование компонента без предоставления пользователям прав на доступ в админку?
      Заранее благодарю за ответ.
        Fi1osof
        05 ноября 2016, 15:14
        +1
        Есть у меня один клиент крупный (колл-центр), там там довольно много пользователей и групп пользователей, и нужна была возможность без всяких переключений в контекстах делать выборки от разных пользователей, чтобы видеть, какие данные им будут предоставлены. Делалось это вот так:) joxi.ru/v29QeZnHGVj4x2

        По твоей задаче: для того, чтобы без лишних танцев с бубнами, была корректная проверка на переключение пользователей, надо все-таки, чтобы пользователь имел авторизацию сразу в двух контекстах. Не думаю, что в ядре компонента этот механизм поменяется, но за +1000 к купленному компоненту я подправлю его на твоем сайте под твои нужды, чтобы он не использовал mgr-контекст.
          Антон Фомичёв
          05 ноября 2016, 15:30
          +1
          Спасибо! Подправить, полагаю, смогу. Только вот с обновлениями придется возиться. Или не обновлять:))
          Не подумай, что пожалел денег, но я не имею права допустить в админку посторонних:))
            Fi1osof
            05 ноября 2016, 15:36
            +1
            Не пускай. Дай ссылку на сайт, я сам зайду)))
            Шутка на злобу дня :)

            Если сможешь модифицировать, может и покупать тогда не надо, если на это хватает знаний. Если вдруг не хватит, то можно подправить с ошибками, а с безопасностью шутки плохи. Ну да ладно, это уже тебе решать.
            Я не напрашиваюсь, но все-таки это дело такое.
              Антон Фомичёв
              05 ноября 2016, 15:50
              +1
              Не пускай. Дай ссылку на сайт, я сам зайду)))
              Шутка на злобу дня :)
              Да уж… Жесть как она есть:))

              Давай так. Я на следующей неделе этим смогу заняться, куплю компонент и посмотрю код. Если возникнут сомнения, я обращусь и договоримся о стоимости.
              В любом случае спасибо за предложение!
                Fi1osof
                05 ноября 2016, 16:03
                1
                +2
                ОК.
                Подсказываю вариант: создаешь еще один контекст без всяких документов, прав и т.п. Вешаешь плагин на авторизацию веб-пользователя. Если пользователь такой, который должен иметь права на переключение, его в плагине делаешь $modx->addSessionContext($ctx), то есть дополнительно авторизуешь его в этот спецконтекст. А плагин switchUser модифицируешь на проверку авторизован в этом контексте или нет, там посмотришь. Только там еще на контексте проверка есть на право user_save, вот это можешь убрать. Если ты никого в этот контекст не будешь авторизовывать, то дополнительные проверки не потребуются (во всяком случае, если это не публичный компонент). или можешь добавить допправа на этот контекст и их дополнительно проверять.
                  Николаевич
                  09 марта 2017, 23:19
                  0
                  Подскажите, Николай. Как авторизоваться не только в текущем контексте, но и во всех дополнительных?
                    Fi1osof
                    09 марта 2017, 23:43
                    +1
                    Уточните, вы спрашиваете как это сделать средствами switchUser? Или в принципе?
                    Если switchUser, то отвечу, что пока он этого не умеет делать, к сожалению. Может позже добавлю эту функцию. Пока же можете сделать копию текущего плагина, старый отключить, а в новом перечислить нужные контексты в конструкции $modx->user->addSessionContext($modx->context->key); типа
                    $modx->user->addSessionContext('web');
                    $modx->user->addSessionContext('web2');
                    $modx->user->addSessionContext('web3');
                    Если контекстов много, то конечно же можно получить список контекстов запросом.
                      Николаевич
                      09 марта 2017, 23:51
                      0
                      Спасибо. И на 18 и на 51 строках плагина менять?
                        Fi1osof
                        10 марта 2017, 00:48
                        0
                        Не за что.
                        Максим ниже показал как.
                      Максим Кузнецов
                      10 марта 2017, 00:20
                      1
                      +4
                      Лучше сделать так (в плагине):

                      меняем строку (в двух местах)
                      $modx->user->addSessionContext($modx->context->key);

                      на следующую
                      $contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
                      
                      foreach($contexts as $context) {
                      	$modx->user->addSessionContext($context->key);
                      }
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14