Описание компонента boAccess Компонент предназначен для автоматизации обработки уровней (прав) доступа к таблицам, записям в таблицах, операциям. То, на каком уровне будет разграничен доступ к таблицам и записям системы, определяет проектировщик. Разграничение доступа на уровне записи В те таблицы, для которых требуется разграничение прав доступа на уровне записи, добавляются специальные поля. Разработчик ответственен за то, чтобы в запросах добавлять условия для обработки прав доступа. В данном случае используется т.н. полу автоматизация. А именно, разработчик конструирует запросы и использует в них метапеременную /*<UserGroups>*/. Компонент TboAccess автоматически инициализирует эту переменную для указанных компонентов доступа к данным. Кроме этого, TboAccess перехватывает обработчики BeforeDelete и BeforeUpdate для указанных таблиц или запросов. При попытке изменения/удаления записи проверяется наличие у пользователя соответствующих прав. Данный метод сработает, если используется IBUpdateSQL или IBTable. Если используется непосредственное добавление/изменение/удаление, то разработчик должен вручную проверять права пользователя перед выполнением соответствующего запроса. Проверка прав осуществляется с помощью вызова соответствующих методов компонента. Разграничение доступа на уровне таблицы Если необходимо установить права доступа на уровне таблицы, также можно использовать компоненту в полуавтоматическом режиме. Под этим подразумевается проверка права на доступ вручную вызвав соответствующий метод, а проверка на модификацию, удаление, добавление автоматически. Использование компонента Компонент помещается на каждую форму (модуль данных), где необходимо обеспечить разграничение. Он самостоятельно связывается с компонентом TboLogin для получения данных о текущем пользователе. Технически, связь осуществляется через глобальную переменную в модуле GD_SECURITY.PAS Компонент используется для разграничения доступа на уровне таблиц в ручном режиме. Т.е. когда программист сам проверяет наличие прав на выполнение операции для данной таблицы. Компонент используется для разграничения доступа на уровне записи в полуавтоматическом режиме. Т.е., когда программист включает в запросы метапеременную, которая инициализируется компонентом. В этом случае в компоненте необходимо указать список ДатаСетов для которых будет осуществляться подставление (инициализация) мета-переменной. Компонент хранит список DataSet-ов для которых необходимо выполнять разграничение прав доступа. Список задается разработчиком в дизайн режиме. Кроме этого компонент позволяет организовать диалог с пользователем для просмотра/изменения прав доступа к записи. Подключает свой обработчик события BeforeOpen, по которому инициализирует метапеременную значением свойства InGroup из компонента TboLogin. Он же подключается к обработчикам событий BeforeEdit и BeforeDelete для того, чтобы предотвратить операции на которые у пользователя нет прав. Компонент позволяет проверить наличие прав у пользователя на чтение/ изменение/ удаление/ вставку конкретной записи. Для этого вызывается соответствующий метод, куда передаются: имя таблицы, ключ записи и множество операций. Функция возвращает Истину, если доступ есть и Ложь — в противном случае1. Другой вариант метода позволяет передать компонент TDataSet. В этом случае проверяются права для текущей записи в этом TdataSet. Еще одно предназначение компонента TboAccess — это проверка прав пользователя на выполнение операции. Типы данных Типы доступа: TAccessLevel = (alFull, alChange, alView); TAccessLevels = set of TAccessLevel; Свойства property DataSetList: TStringList; Список DataSet-ов которые будут обрабатываться в полуавтоматическом режиме. Может включать компоненты типа TIBTable, TIBQuery, TIBDataSet. Список задается разработчиком в дизайн режиме. Методы function CheckRigths(ADataSet: TDataSet; const AnAccessLevels: TAccessLevels): Integer; Проверка прав на выполнение действий над текущей записью в передаваемом ADataSet. ADataSet должен быть открыт. В параметр AnAccessLevels передаются запрашиваемые уровни доступа. Например, если проверка выполняется перед удалением записи, то передается [alFull]. Если перед редактированием — [alChange]. Возвращаемые величины: 1 права подтверждены 0 права отсутствуют -1 не найдены поля отвечающие за права доступа function CheckRigths(const ATableName: String; const AnId: Integer; const AnAccessLevels: TAccessLevels): Integer; Позволяет проверить доступ к произвольной записи, произвольной таблицы. Данный метод предназначен только для таблиц, где есть ключ ID. Если ключ составной придется открывать эту таблицу отдельно и пользоваться предыдущим методом. function CheckRigths(const ATableName: String; const AnAceessLevels: TAccessLevels): Integer; Функция проверяет права доступа к таблице заданной параметром TableName. function CheckRigths(const AnOperation: Integer): Integer; Функция возвращает 1, если пользователь имеет права на выполнение указанной операции Эта функция используется, если из программы запись добавляется при помощи прямого выполнения UPDATE, DELETE. Если используется UpdateSQL, то предпочтительнее автоматический контроль. 1 function ChangeRigth(ADataSet: TDataSet): Boolean; На экран выдается диалоговое окно для просмотра/изменения прав доступа для текущей записи в ADataSet. Возвращает True, если пользователь выбрал Ок, и False — в противном случае. Компонент сам анализирует наличие полей afull, achag, aview и выводит соответствующие поля. Изменение прав доступа разрешается только тому пользователю, который имеет полный доступ к данной записи. В противном случае возможен только просмотр. function ChangeRigth(var AFull, AChag, AView: Integer; ARigth: Byte): Boolean; Тоже самое, только права задаются непосредственно. Используемые поля передаются при помощи ARigth. 1- Afull, 2- Achag, 4- Aview. function TboAccess.GetRigths(const ATableName: String; const AnId: Integer; var AFull, AChag, AView: Integer; var ARigth: Byte): Boolean; Позволяет вытащить права для одной записи с полем ID в AnId в таблице AtableName. Переменные (Afull, Achag, AView) содержат соответствующие права доступа к записи. Переменная Arigth используемые права. Результат True если права для записи найдены и False если права или запись не найдена.