Содержание
Настройка прав доступа
Права доступа — набор правил, разграничивающий доступ различных пользователей/групп пользователей (ролей) к данным и элементам интерфейса любого программного продукта, разработанного на платформе TMAPlatform (далее платформа). Обычно эти правила зависят от должности и вида деятельности разных сотрудников, работающих с программным продуктом.
Для объединения пользователей в группы используется механизм ролей, поддерживаемый практически всеми реляционными Системами Управления Базами Данных (далее СУБД).
Стоит отдельно отметить, что все права в системе делятся на два вида — «На уровне клиента» и «На уровне СУБД». Права, которые даются на уровне СУБД (например, права на действия с таблицами, полями таблиц, права на выполнение хранимых процедур и т. д.), контролируют действия пользователя во всех случаях, независимо от способа подключения пользователя к Базе Данных (далее БД). Права на уровне клиента (например, права на просмотр форм, выполнение модулей программного продукта), как видно из названия, контролируются только на уровне приложения, т. е. только тогда, когда пользователь работает в определенном программном продукте. Очевидно, что эти виды прав взаимосвязаны — не имеет смысла давать пользователю право на просмотр справочника, если нет прав на просмотр таблицы БД, связанной с этим справочником, в этом случае платформа не даст установить такие права.
Пример настройки прав доступа
Рассмотрим пример настройки прав доступа пользователя Иванов к модулю Амортизация. Откроем пункт меню Файл->Настройка прав доступа. И увидим форму настройки следующего вида
Рис.1 Форма настройки прав доступа при первом открытии
В этой форме мы видим все программные модули редактора. Для добавления пользователя необходимо сделать следующие шаги: если у вас нет таблицы пользователей в редакторе, то необходимо ее создать: создадим таблицу sysWorkers (название произвольное), в которой должны быть следующие поля: Логин, ФИО, Роль, Пароль. И укажем эти поля в св-вах программы
Рис.2 Указываем таблицу пользователей в св-вах программы
Для настройки прав доступа ролей необходимо создать роли в соответствующем разделе дерева редактора и выбрать роль в настройках прав доступа. Далее при нажатии кнопки Добавить пользователя/роль в настройках прав доступа выбираем пользователя/роль, права которых мы будем настраивать. После добавления пользователя Иванов (для примера):
Рис.3 Форма настройки прав доступа после добавления в нее пользователя
Нам остается только пройтись по метаданным редактора и отметить нужные нам позиции, к которым пользователь будет иметь доступ.
Внимание: Перед настройкой прав доступа, надо проверить процедуру OnCreate модуля Global, которая запускается автоматически при запуске программы, и учесть используемые в ней объекты метаданных, которые надо разрешить пользователю для запуска программы. Например, в нашем случае в процедуре OnCreate модуля Global идет проверка на актуальность загруженных курсов валют, следовательно, надо дать право пользователю на таблицу курсов валют, чтобы он смог зайти в программу. Также для запуска программы пользователю необходимы права на чтение таблицы пользователей (в нашем случае вышеуказанная таблица sysWorkers)
Следует также отметить важный факт — от настройки прав доступа на уровне клиента (формы и справочники) будет зависеть вид главного меню, т. е. видимость соответствующих пунктов будет аналогична правам пользователя на объекты, которые вызываются через главное меню программы.
Настроим таблицы, программные модули и элементы интерфейса на примере модуля Амортизация:
Рис.4 Пример настройки прав на таблицу БД
Все таблицы БД настраиваются в отдельном окне, которое вызывается при двойном щелчке на поле в колонке настраиваемого пользователя напротив необходимой таблицы, данная форма показана на рисунке 4. На таблицы БД настраиваются стандартные права — Отображение (Select), Вставка (Insert), Изменение (Update) и Удаление (Delete) как всех записей таблицы, так и отдельных её полей. Для настройки определенных прав на все записи надо кликнуть на соответствующем заголовке таблицы (например, Отображать — при этом выделятся все поля данной колонки). На рисунке 4 видно, что пользователю Иванов мы дали все права на всю таблицу docDpr. Аналогично настраиваются остальные таблицы модуля в соответствии с правами пользователя. Другие объекты редактора (такие, как программные модули и хранимые процедуры с функциями) просто отмечаются в соответствующих полях настраиваемого пользователя. При этом дается право на запуск соответствующего модуля. Замечание: платформа никак не проверяет, какие объекты БД и Клиентской программы используются в указанном модуле. Фиксация изменений и запись в БД происходят по нажатию на кнопку «Установить права доступа» в главном меню формы настройки. После фиксации выводится окно, в котором видно, какие права и на что зафиксированы. Следует отдельно отметить то, что платформа при необходимости автоматически раздает права на определенные объекты. Рассмотрим данные случаи.
Автоматически раздаваемые права — в случае наличия в таблице полей подстановки (далее lookup-полей), на которые даются права, система автоматически даст права на чтение первичного ключа подстановочной таблицы (по умолчанию в платформе это поле называется id) и поля описания этой таблицы (по умолчанию — Name). О чем выведутся соответствующие предупреждения. Например: Мы хотим дать пользователю Иванову право на чтение таблицы Справочник валют (dirCurr):
Рис.5 Пример автоматически раздаваемых прав на уровне СУБД
Как видно из рисунка 5, пользователю Иванов даны права на чтение всех полей таблицы dirCurr. Однако при отображении данной таблицы элементами интерфейса платформы, поле IsoCode, являющееся lookup-полем, заменяется значение поля Name из таблицы rctCurr (классификатор валют), что видно в редакторе (тип поля IsoCode — *rctCurr):
Рис.6 Редактор платформы (показана связь, по которой платформа автоматически дает права)
Соответственно для корректной работы интерфейса программного продукта, разработанного на платформе, необходимо, чтобы пользователю было разрешено чтение полей Id и Name таблицы rctCurr, что за нас автоматически сделает платформа и выведет предупреждение вида:
Автоматически разрешены для пользователя 1 (Иванов) поля rctCurr. Id, rctCurr. Name
Аналогичным образом платформа предупредит, если права доступа не стыкуются с правилами, описанными во внешних ключах БД. Например, если мы даем право на удаление записей из таблицы, которая связана ключом с другой таблицей, и в правилах внешнего ключа выбраны каскадные действия удаления или изменения, то платформа предупредит, что на связанную по внешнему ключу таблицу тоже неплохо бы дать соответствующие права, чтобы не пугать пользователя ошибками.
Ограничение прав на уровне записей
Для всех таблиц БД, права доступа к которым мы настраиваем, можно ограничить определенного пользователя/роль набором фильтров, которые доступны нам в окне настройки прав в разделе Фильтровать записи (см. рис.4 и рис.5). Мы можем интерактивно выбрать значения фильтров для lookup-полей, а также задать абсолютно любое условие фильтрации записей на внутреннем языке запросов в разделе SQL фильтр записей. Например, мы хотим давать пользователю право на просмотр документов амортизации только определенного способа начисления:
Рис.7 Пример настройки фильтров для разграничения прав на уровне записей
В случае применения показанного на рисунке фильтра, пользователь Иванов будет видеть только документы амортизации, в которых выбран линейный способ начисления. Аналогично можно разграничить права в документах между пользователями по контрагентам и т. п. Опция исключить — пользователь будет видеть все документы, в которых способ амортизации не равен выбранному. Если нам нужны более сложные условия фильтрации для разграничения прав на уровне записей, следует использовать SQL фильтр, который описывается на внутреннем языке запросов. Например, если нам надо показывать пользователю только записи, которые он сам создал, то в sql фильтре следует написать:
user_id = user(), где user_id — это имя поля, которое заполняется функцией user() при создании записи, а user() — функция встроенного языка, которая возвращает идентификатор пользователя из таблицы пользователей программы, про которую упоминалось выше.