Проверка прав доступа
Когда пользователь пытается получить доступ к ресурсу, SberMobile Server просматривает его таблицу прав доступа построчно, начиная с самой первой (верхней).
Если путь контекста ресурса, к которому пользователь пытается получить доступ, совпадает или продолжает маску контекста, определенную в текущей строке таблицы прав, уровень прав доступа в этой строке будет эффективным уровнем прав доступа для этого пути. Как только совпадающая строка найдена, другие строки не проверяются на совпадение. Так, например, если вы начинаете таблицу с контекстом * (т.е. первая строка в таблице), другие строки не будут проверяться, потому что эта строка совпадает со всеми контекстами. Именно по этому контекст * всегда является последней строкой в таблице.
Требуемый уровень прав доступа, определенный на предыдущем шаге, сравнивается с уровнем прав доступа, запрашиваемым ресурсом, к которому осуществляется доступ. Если эффективный уровень включает уровень прав доступа источника, доступ будет разрешен. Иначе, в доступе будет отказано.
Если контекстный путь запрашиваемого ресурса не соответствует или не расширяет любую маску в таблице, эффективный уровень прав доступа запрашиваемого ресурса определяется последней строкой в таблице прав доступа, потому что она всегда определяет уровень прав доступа для всех контекстов (Маска контекста *).
Пример 1
Предположим, что таблица прав доступа пользователя john выглядит следующим образом:
Строка | Маска контекста | Права доступа |
1 | users.test | Менеджер |
2 | users.* | Не определен |
3 | * | Менеджер |
John пытается получить доступ к
users.abc.alerts. Необходимый уровень прав для данного ресурса является Менеджер. Первая строка таблицы, users.test, не совпадает и не продолжает маску users.abc.alerts, поэтому мы переходим ко второй строке users.*, и видим, что она продлевает users.test. Данная вторая строка задает Не определен в качестве уровня прав доступа, и поэтому доступ будет запрещен.
John пытается получить доступ к
event_filters.filter1, требующий уровень прав доступа Менеджер. Эффективный уровень прав доступа для event_filters.filter1 будет определен третьей строкой в таблице, и, таким образом, доступ будет запрещен.
John пытается получить доступ к
users.test.queries, требующий уровень прав доступа Администратор. Его эффективный уровень для этого контекста определяется первой строкой в таблице. Он будет уровнем Менеджер (ниже, чем Администратор), и, таким образом, доступ к users.test.queries будет запрещен.
Пример 2
Таблица прав доступа администратора по умолчанию:
Строка | Маска контекста | Права доступа |
1 | * | Admin |
Эффективный уровень прав доступа администратора по умолчанию для любого контекста - Администратор, потому что все контекстные пути продлевают маску *. Поэтому администратор может выполнять любую операцию в контексте.
Окно отказа в доступе
Если прав доступа пользователя недостаточно для осуществления требуемой операции, в доступе будет отказано, и появится сообщение об ошибке "Нет прав".
Временное отключение доступа к некоторым объектам
Когда таблица прав доступа пользователя настраивается так, чтобы запретить ему доступ к некоторым из ресурсов, никаким образом не влияя на сами ресурсы. Фактически, какой-либо другой пользователь может иметь доступ к этим ресурсам, даже если для их владельца доступ запрещен.
Пример
John, пользователь из последнего примера, имеет контекст Тревоги, users.john.alerts. Данный путь существует всегда. Изначально John может получить доступ к его Тревогам, потому что это позволяет Права доступа пользователя по умолчанию. Он входит на SberMobile Server и создает тревогу alert1. Затем администратор настраивает таблицу прав доступа John'а так, чтобы он больше не смог видеть его контекст Тревоги (например, добавив запись с Маской контекста users.john.alerts и Уровнем прав доступа Не определен в начало таблицы). Это не удалит alert1 и даже не прекратит ее работу. Некоторые пользователи SberMobile Server все еще имеют доступ к этой тревоге и смогут конфигурировать и контролировать ее. Как только администратор разрешает John'у получить доступ к его тревогам, alert1 снова появится в его контексте Тревоги.