Acess Control Lists

Эта тема в разработке - все что тут изложено может и поменяться

Основная идея - сделать возможность задавать права видимости и изменений для произвольных объектов, в частности страниц. В качестве эксперимента разработаывается в отдельной ветке проекта KB

Права сейчас = RWA.

  • R - read, страница только показывается
  • W - write, страница показывается и редактируется
  • A - administration. W плюс возмоность менять видимость страницы и полностью ее удалить
  • O - owner. По сути, неснимаемый A. Используется в отдельных случаях.

Представление прав

Как в линуксе, маской с битами с весами R==1, W == 2, A == 4, O == 8. Таким образом чем больше число маски, тем больше прав. Текущие права MEA (member, erotor, admin) конвертируются в RWA в указанном порядке (право O не устанавливается).

Группы

Группа - поименованный список пользователей с правами. У группы, кроме специальной группы everyone, есть родительская группа. Пользователи в группе имеют маску прав RWAO. Администраторы могут добавлять и удалять пользователей и управлять статусом администратора. Владельцы имеют права администраторов, а также право удалять группу и удалять себя из группы и назначить нового владельца. Владелец группы всегда один.

Маска прав в группе определяет права при доступе к объектам группы (страницам например).

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

Удаление владельца

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

Удаление группы

Осуществляется поиск страниц, которые видимы только для данной группы (нет записи для everyone). Если такие страницы есть, то следует предложить выбор, и показать список первых таких страниц:

  • отменить операцию (владелец сможет настроить права на страницах и повторить удаление)
  • удалить все такие страницы окончательно (переспросить)
  • перевести все такие страницы в группу everyone (переспросить).

everyone

Виртуальная группа куда входят все пользователи системы, включая не аутентифицированных посетителей. Из нее нельзя удалить пользователей (точнее, удаление возможно только с удалением учетной записи в системе)

обычные группы

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

Группа в группе

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

Видимость пользователей

Когда администратор добавляет пользователей в группу, он может либо ввести полностью емейл или name (nick), либо выбирать из списка всех пользователей всех групп где он администратор.

Видимость объекта

Задается списком прав по группам (список группа-маска). Для расчета маски видимости, выбираются все группы, к которым принадлежит текущий пользователь, в этом списке всегда как минимум одна группа (everyone), и одновременно которые есть в списке ACL страницы.

Если результат пустой, текущий пользователь не имеет доступа к объекту.

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

Если результат непустой, то получаем список: [группа, маскастраницы, маскавгруппe]. Для каждой строчки вычисляем битовое И (маскастраницы & маска_в _группе), получаем действующую маску для каждой группы (по смыслу, остаются только права, которые установлены и для объекта, и для группы).

Из полученного списка выбираем маску с максимальным численным знаением, это и будет маска доступа, которая интерпретируется как RWAO для доступа к объекту.

Неоднозначности

Действующие маски рассчитываются исходя из всех указанныз прав.

Если группа A включена в группу B, а объект содержит маску и для A и для B, то будет выбрана максимальная. Например, пользователь U имеет права

U(A:R--, B:RWA)

при этом группа B включена в A с правами A=[B:R--,...]

Если у нас есть объект с ACL=[A:RWA, B:R--], то пользователь U не имеет прав записи или администрирования для этого объекта, так как группа B имеет право только на чтение, а в группе A он включен через группу у которой есть только права на чтение.

Действительно, при расчете списка для объекта, мы рассчитываем в группе А - группа B имеет маску включения R--, таким образом пользователь U в группе A имеет маску (R-- & RWA) == R--. Также, ACL содержит маску для группы B:R--, что означает, что все участники группы B независимости от их прав в группе B будут иметь только доступ по чтению.

Теперь представим себе, что мы создали группу C(U:RWA) и добавили ее в ACL как [C:RWA,...] - теперь пользователь получит полный доступ к объекту, так как по группе C в ACL его маска (RWA & RWA) == RWA имеет максимальное значение.

Изменения стратегии кеширования

В ключ кеширования в качестве параметра ставится не признак возможности редактирования, а результирующая маска RWAO. Таким образом, в кеше может быть до 3 вариантов страницы (которые реально могут отличаться), вариант с маской ноль в кеш не попадет так как такая страница должна редиректиться на статическую страницу 403 с пояснением.