Права доступа
Уровни доступа
Уровень доступа в Смереке – вещь очень простая. Это число от 0 до 255, которое определяет степень секретности данной вершины. Пользователь может увидеть вершину только в том случае, если его уровень доступа является не меньшим, чем уровень доступа вершины. Уровень доступа пользователя определяется той группой, к которой он принадлежит. Уровень доступа вершин определяется редактором сайта и сохраняется в атрибуте accesslevel вершины.
Анонимному участнику из Интернета по умолчанию предоставляется уровень доступа 5. Итак, страницы с уровнями доступа 0 .. 5 является общедоступными.
Логика секретности подсказывает, что уровни доступа должны увеличивались от корня дерева до терминальных вершин. То есть самые секретные страницы должны быть глубже погружены в дерево, иметь высокие иерархические уровни. Тем не менее из определенных соображений сайт может иметь «острова» страниц публичного доступа, подчиненные секретным вершинам. Такие страницы являются полусекретными – если пользователь знает их URL, он может их увидеть, но они не доступны через стандартные навигационные механизмы Смереки.
Конструктор страниц Смереки должен сам решать, оповещать ли пользователя о наличии подчиненных страниц с более высоким уровнем доступа. Такое уведомление может быть полезным, например, для организации платного доступа к информации.
Назначение уровней доступа
При добавлении новой вершины она автоматически приобретает уровень доступа вершины-хозяйки. Часто это именно то, что нужно.
Конечно, редактор не может задать для вершины уровень доступа выше того, который имеет он сам (т.е. не может скрыть вершину от себя самого).
Блокировка доступа
Администратор Смереки может определить, что должно происходить в случае, если пользователь не имеет прав доступа к веб-страницы. Реакция определяется атрибутом AccessBlock для субдомена, в контексте которого произошла блокировка. Предустановленные значения:
403 – отдать код 403 (Forbidden) согласно определению HTTP протокола и сформировать страницу с объяснением причины отказа. Такой ответ означает, что Смерека признает существование страницы. Это значение употребляется по умолчанию.
404 – отдать код 404 (Not found) согласно определению HTTP протокола и сформировать страницу с сообщением, что страницы не существует. Такой ответ означает, что Смерека отрицает существование страницы (это может быть полезным для секретных страниц, само существование которых является секретным).
Custom – вызвать функцию CustomAccessBlocking. Эта функция должна сформировать соответствующую реакцию на выявленную ситуацию. По умолчанию она возвращает код 403.
Silent – осуществить внутреннее перенаправление на корневую страницу субдомена (оптимально для случая, когда не стоит пугать пользователя сообщениями об ошибках).
Права пользователей
Анонимный пользователь по умолчанию имеет только одно право – просматривать доступные ему страницы сайта, используя ту функциональность, которую они предоставляют (например, делая покупки в интернет-магазине или отправляя сообщение через форму обратной связи).
Зарегистрированный пользователь приобретает права, которые определены в группе, к которой он принадлежит (точнее, к которой относится его учетная запись). Он всегда имеет право просмотра с уровнем доступа 0..$MaxPublicLevel. Все другие права (добавлять / изменять / удалять что-то и т.д.) действуют только в пределах зоны влияния группы.
Группа – это вершина специального класса, предназначенная для управления правами доступа. Группы образуют отдельную иерархию Смереки. Группа может содержать другие группы, пользователей и ссылки на зоны администрирования. Зоной влияния группы является совокупность зон администрирования. Группа, которая не содержит ни одной зоны администрирования, не имеет влияния (в прямом и переносном смысле): члены такой группы не имеют вершин БД, к которым они могут применить свои права.
Иерархия групп начинается с группы глобальных администраторов (по умолчанию она имеет имя Administrators). Эта группа предоставляет пользователям все права, которые только существуют в Смереке. По умолчанию в этой группе создается один пользователь с именем Admin и одна зона администрирования, которая охватывает все дерево вершин сайта. Поэтому-то членство в этой группе дает право управлять всеми объектами Смереки.
Администратором в Смереке называется каждый пользователь, имеющий права добавлять / удалять / изменять объекты администрирования, то есть группы, пользователей и зоны. Область администрирования распространяется на все объекты той группы, к которой принадлежит администратор, и на все подчиненные объекты. Администратор имеет право просматривать свойства своей группы, но не имеет права их менять – для этого требуется вмешательство администратора высшего уровня. Отсюда следует, что свойства группы глобальных администраторов не могут быть изменены (и не надо!).
Имея соответствующие права, администратор может создавать новые группы, подчиненные своей группе, и делегировать им права. Общее правило заключается в том, что администратор не может делегировать больше прав, чем имеет сам, но может уменьшить объем прав. Таким образом, права групп сужаются по мере удаления от группы глобальных администраторов. Но следует понимать, что группа не наследует от группы-хозяйки никаких свойств. В частности, зона влияния определяется для каждой группы отдельно.
Определяя права групп, администратор должен помнить, что в Смереке право CanModify* важнее, чем права CanCreate* и CanDelete*. Пользователь должен получить право изменять соответствующие объекты, чтобы попасть в редактор этих объектов, где лежат команды создания / удаления.
Зоны администрирования
Зона администрирования создается из любой вершины дерева Смереки добавлением двух атрибутов ZoneId, ZoneMask. Эти атрибуты являются скрытыми и недоступны для редакторов вершин. Их могут видеть только те администраторы, которые имеют права над зонами. Зоной является крона такой вершины.
Внутри зоны администрирования можно создавать другие зоны администрирования при условии, что ключи этих зон будут соответствовать маске зоны-хозяйки (т.е. ZoneId AND (NOT ParentZoneMask) == ParentZoneId. Ясно, что зона с нулевой маской (терминальная зона) уже не может иметь вложенных зон.
По умолчанию создается только одна зона администрирования. Она ассоциирована с корневой вершиной иерархии Смереки и имеет ZoneId = 0, ZoneMask = 0xFFFFFFFF, т.е. поглощает все другие зоны администрирования.
Управление зонами является достаточно сложной операцией, которая требует четкого планирования и ясного осознания возможных побочных последствий.
Создание новой зоны возможно везде, кроме терминальной зоны. Ключ новой зоны должна соответствовать маске действующей в данном контексте зоны. После создания новая зона захватывает всю крону своей базовой вершины. Если при этом встречаются вложенные зоны, они остаются неизменными при условии, что они соответствуют маске вновь создаваемой зоны; в противном случае эти зоны удаляются, и относящиеся к ним вершины включаются в новосоздаваемую зону. Такое каскадное удаление зон может иметь нежелательные последствия для групп, которые использовали эти зоны.
При удалении зоны принадлежащие к ней вершины присоединяется к зоне-хозяйке. Вложенные зоны остаются неизменными.
При изменении настроек зоны применяется алгоритм создания новой зоны с новыми параметрами. Следовательно, расширение маски зоны является безопасным, его сужение – потенциально опасным, а смена ключа – безусловно опасным. Рассмотрим это на примерах.
Исходное состояние | Новое состояние | Последствия |
ZoneId = 0x11223300 ZoneMask = 0x000000FF |
ZoneId = 0x11223000 ZoneMask = 0x00000FFF |
Расширение маски (безопасно); вложенные зоны остаются неизменными. |
ZoneMask = 0x0000000F |
Сужение маски; все зоны с ключами 0x11223310 .. 0x112233FF будут удалены, останутся только зоны 0x11223300 .. 0x1122330F. |
|
ZoneId = 0x11223400 | Изменение ключа. Все вложенные зоны будут удалены. |