Реализация разделения прав пользователей в MODX


Добрый день!
Начинаю разработку нового проекта, там нужно реализовать разделение прав особым образом.

Пока запланировал делать так:
  • Пользователь принадлежит одной из групп — Организаций
  • Все ресурсы находятся в одной из групп ресурсов (для удобства они называются так же, как и организации-группы пользователей)
  • У каждой группы ресурсов добавлен доступ для пользователей с ролью Колл-центр (Ранг 5000) и политикой Object
  • У каждой группы ресурсов добавлен доступ для пользователей с ролью Поддержка (Ранг 8000) и политикой Context (они по умолчанию не видят ни один из ресурсов)
В ходе работы необходимо, чтобы пользователи из Колл-центра могли указывать, какой из ресурсов какому пользователю из Поддержки доступен (по каждому ресурсу в отдельности), после чего пользователь из поддержки сможет просмотреть и отредактировать именно такие ресурсы, которые ему назначены.

Вот собственно и вопрос — как это реализовать?

У меня есть предположение, но не уверен, что оно оптимально:
Создавать для каждого пользователя новую группу ресурсов, к которой ему будет установлен доступ уже в соответствии с политикой Object и добавлять ресурс в его группу, таким образом предоставляя доступ к каждому ресурсу в отдельности выборочно. Не будет ли слишком много групп ресурсов?

Сорри за некоторый сумбур…
11 сентября 2012, 17:37    Илья Уткин   G+  
0    1457 0

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

  1. Василий Наумкин 11 сентября 2012, 17:46 # 0
    Первая мысль — сделать проще:
    В шаблоне этих страниц указать сниппет (или вовсе сделать плагин), который при загруpке будет проверять какое то поле ресурса (например, properties) или ТВ параметр. Там должно быть какое то слово, которое должно быть в определенном поле юзера.

    Если есть — открывается, если нет — ошибка 401.

    Это позволит гибко назначать права и не плодить кучу групп. Права в ресурсе и у юзера лучше хранить в виде json-массива.

    Вторая мысль — написать свою минисистему, с административной частью, и сделать связь юзер-ресурс через отдельную таблицу.

    Выбирайте.
    1. Илья Уткин 11 сентября 2012, 17:58 # 0
      Спасибо, изначально планировал использовать отдельную таблицу, но потом вспомнил, что есть нативная система доступов и свернул на эту дорожку) Вернусь к работе со своими таблицами
      1. Илья Уткин 11 сентября 2012, 18:15 # 0
        Подскажите, пожалуйста еще — как реализовывать списки ресурсов?
        Если в правах доступа мы закрыли доступ к ресурсу, то ни Wayfinder, ни getResources не будут отображать этот ресурс для пользователя. Если делать связь через отдельную таблицу, вставлять список id-шников прям в getResources? Их ведь там тоже может накопиться порядочно — или сниппету getResources плевать на длину параметра &resources?
        1. Василий Наумкин 11 сентября 2012, 19:46 # 0
          Да вроде плевать. Еще есть параметр where — по нему можно выбирать.

          Да и вообще, никто не мешает скопировать нужные сниппеты, переименовать, немного доработать — и использовать вместо оригинальных. Обновлять же вам их не надо из репозитория, так?
      2. Valentin Rasulov 11 сентября 2012, 19:07 # 0
        А мне кажеться писать никаких минисистем не нужно. В модексе очень прекрастное распределение прав.
        + Прекрастная настройка форм где вы можете настроить бек как вам нужно
        1. Василий Наумкин 11 сентября 2012, 19:47 # 0
          Да как сказать. Назначить доступ определенному юзеру к определенному ресурсу можно только через группы.

          При текущей постановке задачи будет мноооого групп. Это, конечно, не проблема, но как то непорядочек.
          1. Valentin Rasulov 11 сентября 2012, 20:29 # 0
            согласен — всё зависит от цыфр…
            Просто интерестная задача — сколько планируеться пользователей пустить, чтобы у каждого был именно свой настройки…

            А правами — не обязательно плодить куча груп. Если вы хотите привязать пользователя к ресурсу (только мой) — пожалуста — плагин в 5 строчек… и есть такие замечательные поля у ресурса как show_in_tree, properties…
            1. Илья Уткин 11 сентября 2012, 23:44 # 0
              В одной организации будет порядка 30-50 пользователей, организаций на начальный период — до 10. Итого до 500 личных групп… А связка будет один ко многим — один ресурс могут видеть несколько пользователей.

              Создание как пользователей, так и групп будет автоматическое, единственное сомнение — не отразится ли это на общей нагрузке на сайт — если около 300-400 человек одновременно будут работать, не будет ли накладно постоянно проверять, к какой группе принадлежит пользователь, к какой группе ресурс, какие стоят разрешения и пр. Это ж сколько запросов постоянно…

              Если использовать отдельную таблицу, то тут проще — выводить только ресурсы у которых есть связь с текущим пользователем, а при редактировании и сохранении перепроверять. Но редактирование будет реже, чем просто просмотр…

              Думаю, попробую все-таки и то, и то — попробую взять положительные качества обоих решений, избавившись от отрицательных.
              1. Valentin Rasulov 12 сентября 2012, 00:11 # 0
                300-400 — тут накладка не в проверке прав будет, а в самой нагрузке на админку… никогда не пробовал такую нагрузку на админке.
                Как я вижу.
                1) урезать всё что можно — показывать только то, что действительно нужно… и отрезать не визуально а напрочь, чтобы не грузилась.
                2) для работы с ресурсами с таким потоком менеджеров, я бы сделал отдельную красивую (даже можно склонировать модекса админку — никто не поймёт… ха-ха) админку с фронта. Но снова, нужно всё продумать, стоит ли овчинка вычинки. Но 800 рук я бы не пускал в админку… хотя х.з. его знает, не сталкивался.
                1. Илья Уткин 12 сентября 2012, 10:20 # 0
                  Не-не, в админку я пускать не буду — сам буду решать, что отображать пользователям и в каком виде — только во фронтенде
        Вы должны авторизоваться, чтобы оставлять комментарии.