[adminTools] Права доступа для ресурсов


Права доступа в MODX — вещь не очень понятная и требует время для познания. С наскока управиться с ними не получится. Даже если нужно просто ограничить доступ к страницам на сайте, всё равно придётся разбираться с группами ресурсов, пользователей, политиками и т.п. Но теперь это делать не обязательно.
Данное решение достаточно простое — у ресурса добавляется вкладка «Права доступа» и в ней можно перечислить, кому показывать страницу, а кому нет. Причём в привычном для многих стиле операционной системы.


Принцип работы

Включается этот механизм системной настройкой admintools_alternative_permissions. После этого у ресурса будет доступна вкладка «Права доступа». Если права не указаны, то ресурс доступен всем без ограничений. Как только добавили права, начинает работать проверка.
Чтобы добавить запись, нажимаем кнопку "+ Добавить" и выбираем нужную строчку в списке «Группа/пользователь».


Первые 2 строчки списка — «Все» и «Гости». Думаю, тут пояснять не нужно. Дальше идут группы. Они выделены жирным шрифтом и обозначены иконкой с несколькими пользователями. Затем перечисляются пользователи (иконка с одним пользователем). Если выбрана группа пользователей, то становится доступным поле «Приоритет». Поясню, зачем оно нужно.
Проверка прав идет последовательно в порядке создания записей. Если указано несколько групп, то права пользователя будут такие, какие указаны для последней группы. Но если у первой группы указать приоритет выше остальных групп, то её права будут выше. Это может пригодится, например, если пользователям группы «Администратор» разрешить доступ, а другой группе, добавленной ниже, запретить. Тогда, если пользователь является членом обоих групп, а у группы «Администратор» приоритет выше, то доступ для пользователя будет открыт. Это что касается приоритета групп. А ещё есть приоритет записей прав.

У записи «Все» наименьший приоритет. У пользователя — максимальный приоритет. Т.е. если группе пользователей дан доступ к ресурсу, а пользователю, входящему в данную группу — нет, то для него этот ресурс будет недоступен и он будет перенаправлен на страницу, указанную в системной настройке unauthorized_page.

Пример

Чтобы закрыть страницу от неавторизованных пользователей, достаточно добавить одну запись «Гости» и запретить им доступ. Всего одно действие! И сравните с обычной настройкой MODX. Чувствуете разницу?
Чтобы наоборот, только гости могли видеть страницу, добавляем:
1. «Все» со значением «Запретить».
2. «Гости» со значением «Разрешить».

В общем, пробуйте. Версия пока бета, но ошибок не замечено.
24 августа 2016, 17:04    Сергей Шлоков   G+  
8    977 +28

Комментарии (18)

  1. Яркий Слава 24 августа 2016, 17:41 # +1
    Толковое дополнение. Буду пользоваться, спасибо!
    1. Роман Садоян 24 августа 2016, 20:08 # 0
      А что будет если пользователь состоит в нескольких группах, с одинаковым приоритетом но одной группе разрешено, другой нет?
      Если указано несколько групп, то права пользователя будут такие, какие указаны для последней группы.
      Получается что группа указана последней будет приоритетнее?
      И что за приориет записи прав?
      Что будет с дочерними ресурсами, в случае если ограничить доступ к родителю?

      А так это очень нужное добавление, однозначно в избранное и плюс автору!
      1. Сергей Шлоков 25 августа 2016, 08:03 # 0
        Получается что группа указана последней будет приоритетнее?
        Да. Я так и написал.
        И что за приориет записи прав?
        Возможно 2 варианта —
        1. Приоритет записей — последовательная проверка добавленных прав.
        2. Приоритет прав — например, «запрещение» выше «разрешения».
        Я выбрал первый вариант, у него больше возможностей.
        Логика такая:
        1. Запись «Все» — имеет наименьший приоритет. Может быть только одна такая запись.
        2. Запись с группой пользователей — перебивает права, указанные в записи «Все». Групп можно указать несколько.
        3. Запись с пользователем — имеет наивысший приоритет. Перебивает права групп и записи «Все». Каждый пользователь может быть указан только один раз.
        Так как групп может быть несколько, то для них как раз и вводится ещё один приоритет.
        Что будет с дочерними ресурсами, в случае если ограничить доступ к родителю?
        Так же как и в родном механизме MODX — права родителя не влияют на дочерний ресурс. Но думаю, такая возможность будет не лишний. Спасибо за идею.
      2. Илья Уткин 24 августа 2016, 21:18 # +4
        Этот функционал так зависит от остального функционала adminTools? Штука очень интересная, но её бы в отдельный пакет. Я бы даже купил, когда в следующий раз придется настраиватть доступы.
        1. Роман Садоян 24 августа 2016, 21:36 # +2
          Было бы хорошо, если бы Сергей вывел эту часть из под компонента.
          1. Владимир 24 августа 2016, 22:08 # +1
            Свой тихий голос отдаю за отдельный пакет с этим функционалом!
            .-.- -....- --… .-
            1. Максим Степанов 25 августа 2016, 04:43 # 0
              По моему если вынести в отдельный пакет, то получится схожий с этим modstore.pro/packages/users/modaccessmanager
              1. Сергей Шлоков 25 августа 2016, 07:44 # 0
                Указанный пакет для ограничения прав в админке. Мой — только для ограничения вывода страниц на сайте.
              2. Сергей Шлоков 25 августа 2016, 07:41 # +1
                Не тянет эта «штука» на отдельный пакет. Полноценного интерфейса в админке нет. Функционал ограниченный — права только для фронта и только «load» и «view». Даже «list» уже не тянет.
                А чем обусловлено такое желание?

                П.С. adminTools — набор независимых друг от друга примочек.
              3. Иван Климчук 24 августа 2016, 23:32 # +1
                Дабы заранее не воротить код, спрошу. Этот компонент — обертка над уже существующими правами (т.е. что-то типа хелпера) или таки права записываюсят как-то отдельно и реализованы по своему?
                1. Сергей Шлоков 25 августа 2016, 07:42 # 0
                  Как-то отдельно и реализовано по своему.
                  1. Волков Николай 25 августа 2016, 20:12 # +1
                    Мне кажется, что в любом случае просто оберткой дополнение это быть не может, т.к. из коробки MODx заставить распределять доступы для отдельных страниц конкретным пользователям, можно разве что через создание групп пользователей для каждого пользователя. Судя по изменениям кода MODx в последних версиях, что-то в ближайшее время намечается новое, но все равно это из разряда наделок на будущее.
                  2. @ndrew 27 августа 2016, 03:46 # 0
                    Есть баг в связке с шопкипером 3.2.4

                    Когда admintools_alternative_permissions активна то вечная анимация прелоадера добавления в корзину и товар не добавляется!

                    Разбираться было лень откатился на 1.6.0
                    1. Сергей Шлоков 27 августа 2016, 08:17 # +2
                      А нельзя было просто отключить admintools_alternative_permissions без отката?
                      1. @ndrew 27 августа 2016, 16:29 # 0
                        Ставил 1.8 только из за этой функции. А другие подводные камни мне не нужны. ;)
                    2. Константин Ильин 29 августа 2016, 13:55 # 0
                      Сергей, спасибо за проделанную работу!
                      Действительно когда приходилось возится с правами это занимало уйму времени.

                      Еще хотелось бы чтоб в пакет admintools входила похожая штука как AjaxManager. Т.к. AjaxManager давно уже не обновляется и поглючивает когда устанавливаешь на текущие версии модх, а Вы занимаетесь админкой и название(admintools) подходящее, было бы круто чтоб похожий плагин(который работает на свежих версиях нормально) входил в Ваш пакет.
                      1. Сергей Шлоков 29 августа 2016, 23:29 # +2
                        Еще хотелось бы чтоб в пакет admintools входила похожая штука как AjaxManager.
                        Это чертовски непростая вещь.
                        1. Константин Ильин 30 августа 2016, 11:41 # 0
                          Понял, но я был бы рад, что кто-то поддерживает идею «AjaxManager» ибо компонент очень помогает в работе.
                          Спасибо и на том, что есть щас!
                      Вы должны авторизоваться, чтобы оставлять комментарии.