Принципы реализации прав доступа платформы Terrasoft

Метки записи:

Эта статья описывает особенности реализации управления правами доступа пользователей на платформе Terrasoft. Здесь рассматриваются все принципы формирования структуры базы данных приложения для реализации этой задачи. Также рассматриваются различия в реализации прав доступа в различных СУБД, и различных способах подключения к базе данных. Эта статья будет полезна всем разработчикам, которые используют для разработки платформу Terrasoft.

Общая информация

Одной из самых важных задач, которую ставили перед собой разработчики платформы Terrasoft, была задача обеспечения высокого уровня безопасности данных. Для решения этой задачи был принят ряд ключевых решений, который позволил обеспечить необходимый уровень безопасности. Одним из самых важных решений была реализация безопасности с максимальным использованием возможностей СУБД. Это позволило бы иметь одинаковый уровень доступа к данным при работе непосредственно из интерфейса Terrasoft, и при прямом обращении к данным, например из каких либо утилит по работе с БД, или при интеграции с другими системами. При этом возникал ряд задач связанный с отображением сущностей платформы Terrasoft (группы пользователей, группы таблиц и т.д.), на сущности БД (роли, пользователи). Для различных СУБД набор таких сущностей обладает различными ограничениями, которые необходимо было учесть.

Некоторые типы прав доступа, существующие в платформе Terrasoft, не существуют в СУБД. Например, не существует стандартного механизма реализации прав доступа к записям таблиц (Row Level Security). Такие задачи также решались с использованием дополнительных возможностей СУБД, что позволило сохранить необходимый уровень безопасности данных.

Второй, не менее важной задачей, была задача сохранение высокого уровня производительности для администрируемых объектов, при больших объемах БД. Этого также удалось достичь за счет реализации прав доступа на уровне СУБД.

Субъекты администрирования (Administration Unit)

Платформа Terrasoft позволяет в равной мере управлять правами доступа на объекты системы как для пользователей, так и для групп пользователей. Оба этих понятия были объединены, и они получили общее название – Субъект администрирования.

Группы пользователей представляют из себя иерархическую структуру. При этом пользователь Terrasoft может входить в несколько групп.

Все субъекты администрирования, создаваемые в интерфейсе Terrasoft, так же создаются в базе данных. При создании пользователя Terrasoft, в БД также создается пользователь, а при создании группы, в БД создается роль. При этом имя объекта в БД может не совпадать с именем создаваемого субъекта администрирования Terrasoft. Это связано с тем, что имена субъектов администрирования могут содержать символы, не допустимые в СУБД для пользователей и ролей.

Для хранения субъектов администрирования в БД существует таблица tbl_AdminUnit. Основные поля таблицы приведены ниже:

Поле

Тип

Описание

ID

Уникальный идентификатор

Уникальный идентификатор субъекта администрирования.

IsGroup

Логическое

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

IsDomainUnit

Логическое

Признак того, данному субъекту администрирования соответствует сущность Windows Active Directory (AD), и для входа данного пользователя в систему будет использоваться интеграция с AD.

Name

Строка

Имя субъекта администрирования.

GroupParentID

Уникальный идентификатор

Уникальный идентификатор родительской группы. Используется только в случае, если значение поля IsGroup=True.

UserContactID

Уникальный идентификатор

Идентификатор контакта, который соответствует пользователю.

UserIsEnabled

Логическое

Признак того, что пользователь может выполнять вход в систему.

UserIsAdmin

Логическое

Признак того, что пользователь является администратором.

UserIsSysAdmin

Логическое

Признак того, что пользователь является системным администратором.

SQLObjectName

Строка

Имя объекта в БД, который соответствует субъекту администрирования.

Флаг IsDomainUnit позволяет указать, что пользователь был добавлен из AD, и что при его входе в систему не понадобится ввод имени и пароля, а будет использоваться авторизация Windows.

Пароль пользователя не хранится в таблице, что позволяет избежать возможности его несанкционированного получения.

Информация о том, в какие группы входит пользователь, хранится в таблице tbl_UserInGroup.

Типы прав доступа Terrasoft

В платформе Terrasoft реализована возможность управления правами доступа к следующим сущностям:

  1. Группы таблиц.
  2. Поля таблиц.
  3. Записи в таблицах.

При этом с правами доступа на конкретные записи в таблицах, тесно связан механизм прав доступа на записи, раздаваемых по умолчанию (права по умолчанию).

О каждом из типов прав доступа будет подробнее рассказано далее в этой статье.

Доступ к группам таблиц

Для удобства раздачи прав доступа на таблицы в платформе Terrasoft было введено понятие "Группа таблиц". Часто встречается ситуация, когда для нескольких таблиц всегда необходимо раздавать одинаковые права доступа. Для этого таблицы "группируются", и в дальнейшем все права раздаются именно на группу таблиц. При этом права, определенные для группы, автоматически устанавливаются на все таблицы, которые в нее входят.

Таблица может входить только в одну группу таблиц.

Для групп таблиц можно устанавливать следующие уровни доступа:

Уровень доступа

Описание

Чтение

Дает право пользователю, или группе пользователей, делать выборки данных из любой таблицы, входящей в группу.

Добавление

Дает право пользователю, или группе пользователей, делать вставку новых записей в любую таблицу, входящую в группу.

Изменение

Дает право пользователю, или группе пользователей, делать изменение существующих записей в любой таблице, входящей в группу.

Удаление

Дает право пользователю, или группе пользователей, делать удаление существующих записей из любой таблицы, входящей в группу.

Объекту "Группа таблиц" в конфигурации соответствует сервис TableGroup. При создании нового сервиса TableGroup в БД создается пять ролей, четыре из которых соответствуют уровням доступа на группы таблиц, а пятая является группирующей, и включает в себя эти четыре роли.

Принцип формирования имен ролей для групп таблиц зависит от СУБД, но в общем случае выглядит следующим образом:

Роль

Принцип формирования имени

Группирующая

"TG_" + [Код сервиса группы таблиц]

Для уровня доступа "Чтение"

"TG_" + [Код сервиса группы таблиц] + "_CR"

Для уровня доступа "Добавление"

"TG_" + [Код сервиса группы таблиц] + "_CI"

Для уровня доступа "Изменение"

"TG_" + [Код сервиса группы таблиц] + "_CU"

Для уровня доступа "Удаление"

"TG_" + [Код сервиса группы таблиц] + "_CD"

Например, для группы таблиц ""Контраген" (Account) в БД созданы следующие роли:

Роль

Роль

Группирующая

TG_ACCOUNT

Для уровня доступа "Чтение"

TG_ACCOUNT_CR

Для уровня доступа "Добавление"

TG_ACCOUNT_CI

Для уровня доступа "Изменение"

TG_ACCOUNT_CU

Для уровня доступа "Удаление"

TG_ACCOUNT_CD

Каждая из четырех созданных ролей по уровням доступа, получает необходимые права на все таблицы в группе. Например, роль TG_ACCOUNT_CI получает право на вставку записей во все таблицы, входящие в группу "Контрагенты", а TG_ACCOUNT_CD на удаление.

При разрешении пользователю или группе, определенного уровня доступа к группе таблиц, он помещается в соответствующую роль. Например, если пользователю разрешается удаление из группы таблиц "Контрагенты", то он помещается в роль TG_ACCOUNT_CD. В случае же запрета уровня доступа, он удаляется из соответствующей роли.

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

Доступ к полям таблиц

В платформе Terrasoft реализована возможность управления правами доступа пользователей и групп пользователей к полям таблиц. Для того что бы таблица попала в список таблиц, для которых можно управлять правами доступа по полям, для ее сервиса Table необходимо установить признак "Администрируется по полям" (IsAdministratedByFields=True).

Для каждого поля таблицы можно установить следующие уровни доступа:

Уровень доступа

Описание

Полный доступ

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

Только чтение

Дает право пользователю, или группе пользователей, только получать данные из поля таблицы.

Доступ запрещен

Запрещает пользователю, или группе пользователей, получать и изменять данные в поле таблицы.

Реализация данного механизма в различных СУБД различная. Это связано с тем, что в Microsoft SQL Server существуют все те же уровни доступа к полям что и в платформе Terrasoft, а в Oracle и в Firebird существуют только "Полный доступ" и "Доступ запрещен". Соответственно, для Microsoft SQL Server полностью используются механизмы СУБД, а для Oracle и Firebird реализован собственный механизм. Для реализации этого механизма используется таблица tbl_TableFieldRight, которая предназначена для хранения информации о правах пользователей на поля. Структура этой таблицы приведены ниже:

Поле

Тип

Описание

ID

Уникальный идентификатор

Уникальный идентификатор записи.

TableServiceID

Уникальный идентификатор

Уникальный идентификатор сервиса таблицы, для поля которой указан уровень доступа.

FieldName

Строка

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

AdminUnitID

Уникальный идентификатор

Уникальный идентификатор субъекта администрирования, для которого указан уровень доступа.

RightsLevel

Целое число

Уровень доступа субъекта администрирования к полю. Значения в данном поле соответствуют значениям перечисления TableFieldAccessLevelEnum

tfalDenyAccess = 0 – Доступ запрещен;

tfalReadAccess = 1 – Только чтение;

tfalFullAccess = 2 – Полный доступ.

Особенностью является то, что для Oracle и Firebird механизм реализован только на уровне ядра системы, и права на поля никак не отражаются на фактические права доступа к полям в БД.

В случае, если для субъекта администрирования не указан уровень доступа к полю таблицы (для Oracle и Firebird не найдена запись в таблице tbl_TableFieldRight), то считается что пользователь имеет полный доступ к полю.

Доступ к записям таблиц

В платформе Terrasoft реализована возможность управления правами доступа пользователей на конкретные записи таблиц. Из всех поддерживаемых СУБД, всетроенные механизмы для реализации данного типа доступа имеет только Oracle. Соответственно для Microsoft SQL Server и для Firebird необходимо было разрабатывать свои механизмы. При разработке было принято решение использовать общий способ реализации для всех трех СУБД, т.е. отказаться от стандартного механизма Oracle.

Для каждой записи таблицы можно установить следующие уровни доступа:

Уровень доступа

Описание

Чтение

Дает право пользователю, или группе пользователей, читать эту запись из БД, т.е. получать ее в выборках (Select Query).

Изменение

Дает право пользователю, или группе пользователей, изменять эту запись в БД, т.е. выполнять для нее запросы на обновление (Update Query).

Удаление

Дает право пользователю, или группе пользователей, удалять эту запись из БД, т.е. выполнять для нее запросы на удаление (Delete Query).

Изменение прав

Дает право пользователю, или группе пользователей, изменять права доступа к этой записи.

Для того что бы для записей таблицы можно было управлять уровнем доступа, для ее сервиса Table необходимо установить признак "Администрируется по записям" (IsAdministratedByRecords=True).

В случае сохранения сервиса таблицы, для которой установлен признак "Администрируется по записям", в базе данных происходят действия, описанные далее.

Запрет доступа пользователей к таблице

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

Создание таблицы прав к записям

В БД создается таблица, предназначенная для хранения информации о правах доступа пользователей и групп к записям таблицы. Имя этой таблицы формируется как [Имя основной таблицы] + "Right". Например, для таблицы tbl_Account имя таблицы прав доступа к записям будет tbl_AccountRight.

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

Поле

Тип

Описание

ID

Уникальный идентификатор

Уникальный идентификатор записи.

RecordID

Уникальный идентификатор

Уникальный идентификатор записи таблицы, для которой определен уровень доступа.

AdminUnitID

Уникальный идентификатор

Уникальный идентификатор субъекта администрирования, для которого указан уровень доступа.

CanRead

Логическое

Признак того, что субъект администрирования имеет право на чтение записи.

CanWrite

Логическое

Признак того, что субъект администрирования имеет право на изменение записи.

CanDelete

Логическое

Признак того, что субъект администрирования имеет право на удаление записи.

CanChangeAccess

Логическое

Признак того, что субъект администрирования имеет право на изменение прав доступа к записи.

Так же как и для основной таблицы, всем пользователям, кроме администраторов, запрещается прямой доступ к этой таблице.

Создание представления на получение данных из основной таблицы

Для получения данных из основной таблицы в БД создается представление (View). Имя этого представления формируется изменением префикса "tbl" в имени основной таблицы, на "vw". Например, имя представления для таблицы tbl_Account будет vw_Account.

Это представление формируется как выборка всех полей из основной таблицы, но выбираются только те записи, к которым текущий пользователь имеет доступ на чтение.

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

Также для данного представления создаются два триггера. Один из них выполняется при обновлении (Update), а второй при удалении (Delete) записей из представления. Эти триггеры предназначены для того, что бы пользователь мог выполнять только те операции над записями, на которые он имеет соответствующий уровень доступа.

Создание представления на получение данных из таблицы прав доступа к записям

Для получения данных из таблицы прав доступа к записям, также создается представление в БД. Имя этого представления формируется по тому же принципу, что и имя представления для получения данных из основной таблицы. Например, имя представления для таблицы tbl_AccountRight будет vw_AccountRight.

Для данного представления формируется три триггера – при вставке (Insert), обновлении (Update) и удалении (Delete) записей этой таблицы. Эти триггеры предназначены для того, что бы ограничить возможность управления правами доступа на записи только тем пользователям, которые имеют соответствующие разрешения.

 

Таким образом реализован доступ к записям таблицы. Эта реализация позволяет утверждать, что права доступа к записям, определенные в приложении, построенном на платформе Terrasoft, будут применяться и для других приложений, обращающихся к БД напрямую.

Права доступа по умолчанию

Процедура раздачи прав доступа на записи может вызывать определенные проблемы. Во-первых, пользователь может при добавлении записи попросту забыть определить уровень доступа других пользователей к ней. Во-вторых, процесс определения прав доступа на записи заставляет пользователя тратить больше времени при вводе новых данных. Для упрощения процесса определения прав доступа на новые записи, был создан механиз парв доступа по умолчанию. Данный механизм позволяет определять, какие права доступа будут автоматически даны на записи, добавляемые тем или иным пользователем системы.

Для реализации прав по умолчанию в БД создаена таблица tbl_TableDefaultRight, которая предназначена для хранения информации об этих правах. Структура таблицы приведена ниже:

Поле

Тип

Описание

ID

Уникальный идентификатор

Уникальный идентификатор записи.

TableServiceID

Уникальный идентификатор

Уникальный идентификатор сервиса таблицы, для которой определены права по умолчанию.

AdminUnitID

Уникальный идентификатор

Уникальный идентификатор субъекта администрирования, который создает запись в таблице.

SubjectAdminUnitID

Уникальный идентификатор

Уникальный идентификатор субъекта администрирования, которому дается доступ к новой записи.

CanRead

Логическое

Признак того, что субъект администрирования получит право на чтение записи.

CanWrite

Логическое

Признак того, что субъект администрирования получит право на изменение записи.

CanDelete

Логическое

Признак того, что субъект администрирования получит право на удаление записи.

CanChangeAccess

Логическое

Признак того, что субъект администрирования получит право на изменение прав доступа к записи.

Также для таблицы, которая администрируется по записям, создается триггер, который срабатывает при вставке новых записей. Этот триггер при добавлении новой записи, раздает на нее права доступа аналогичные тем, которые определены в таблице tbl_TableDefaultRight. Дополнительно к тем правам, которые определены в таблице tbl_TableDefaultRight, автоматически дается полный доступ на запись пользователю, создавшему ее.

Существуют объекты системы, для которых раздача прав по умолчанию отличается от стандартной. Примером таких объектов являются группы в любом разделе. При создании новой группы пользователем с правами администратора, права по умолчанию на нее раздаются стандартным образом. Если же группа создается обычным пользователем, то права по умолчанию не раздаются, а даются только полные права пользователю, который создал запись. В связи с тем что права по умолчанию раздаются триггером в БД, то отменить их вставку невозможно. Поэтому отмена прав по умолчанию в этом случае делается их удалением сразу же после вставки, в обработчике события OnDatasetAfterPost набора данных.

Интеграция с Windows Active Directory

В платформе Terrasoft, начиная с версии 3.2.0, появилась интеграция с Windows Active Directory. Данная функциональность позволяет выполнять вход пользователя в приложение основываясь на авторизации, которую прошел пользователь при входе в операционную систему. При этом нет необходимости вводить имя пользователя и пароль.

Данная функциональность реализована только для СУБД Microsoft SQL Server и Oracle. Для Firebird 2.0 реализовать данную функциональность не возможно, т.к. данный способ соедния в этой СУБД не поддерживается. В Firebird 2.1 этот способ соединения появился, но он имеет ряд ограничений, который не позволяет его использовать в платформе Terrasoft. Также стоит отметить, что данный способ авторизации нельзя использовать при соединении с БД с использованием Web сервисов.