Об одном способе разграничения прав пользователей в приложениях Delphi (документация, исходники)Источник: delphimaster Рощупкин А.В.
Аннотация.В статье рассмотрен один из возможных способов разграничения прав доступа пользователей в многопользовательском приложении. Предложенный метод основан на хранении в базе данных сведений о компонентах формы и их соответствии кодам пользователей. Примеры прилагаемого программного кода адаптированы под базу данных Microsoft Access. В тексте статьи имеются примеры для баз данных Oracle. База данных.В базе данных будем хранить следующую информацию:
Реализация.Для реализации метода будем использовать класс TBaseForm. Внесем изменения в пакет ParentForm.dpk - добавим юнит UntTypes.pas (см. листинг 1). В случае использования базы данных Oracle переменную Global_Connection можно сделать классом TOracleSession (см. описания классов пакета Direct Oracle Access). В класс TBaseForm добавим процедуру SetPermission, которой передаются коннект к базе данных (в случае Oracle - сессию пользователя) и код пользователя (см. листинг 2). unit UntTypes; interface uses ADODB; var // глобальная сессия Global_Connection: TADOConnection; // глобальный код пользователя Global_UsrIdx: integer; implementation end. procedure TBaseForm.SetPermission(Connection: TADOConnection; UsrIdx: integer); var ds: TADODataSet; Ctrl: TComponent; begin if ( csDesigning in Self.ComponentState ) then Exit; if ( Connection = nil ) then Exit; // запрос информации из базы данных ds := TADODataSet.Create(nil); ds.Connection := Connection; ds.CommandType := cmdText; ds.CommandText := 'SELECT ROL2USR.ROLIDX, DFM.DFMNME, DFM.CRLNME ' + 'FROM DFM, ROL2USR ' + 'WHERE (((DFM.DFMNME)=' + #39 + Self.Name + #39 + ' AND [DFM].[ROLIDX]=[ROL2USR].[ROLIDX]' + ') AND ((ROL2USR.USRIDX)=' + IntToStr(UsrIdx) + '));'; ds.Open; // делаем недоступными только те элементы управления // которые хранятся в базе while ( not ds.Eof ) do begin Ctrl := Self.FindComponent(ds.FieldByName('CRLNME').AsString); if ( Ctrl <> nil ) then if ( Ctrl is TWinControl ) then TWinControl(Ctrl).Enabled := False; ds.Next; end; ds.Close; ds.Free; end; Листинг 2. Процедура SetPermission.
Вызов процедуры SetPermission поместим в конец конструктора TBaseForm. Инициализация переменных Global_Connection, Global_UsrIdx должна происходить при входе в программу до создания окон, унаследованных от TBaseForm. Естественно, сама форма, в которой происходит вход, не должна быть наследником TBaseForm. Причем, при использовании Oracle рекомендуется сначала соединяться с базой данных "слабым" пользователем, т.е. таким у которого есть права только на выбор из минимального числа таблиц - таблицы пользователей и т.д. Только после проверки правильности ввода пароля можно выполнить команду alter session для аккаунта пользователя. |