Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
 
Трансферы лето краснодар ставки и проценты по кредитам банка лето.

Об одном способе разграничения прав пользователей в приложениях Delphi

Рощупкин А.В.
Уральский государственный университет путей сообщения, лаборатория математического моделирования и компьютерных технологий, Екатеринбург

Аннотация.

  В статье рассмотрен один из возможных способов разграничения прав доступа пользователей в многопользовательском приложении. Предложенный метод основан на хранении в базе данных сведений о компонентах формы и их соответствии кодам пользователей. Примеры прилагаемого программного кода адаптированы под базу данных Microsoft Access. В тексте статьи имеются примеры для баз данных Oracle.

База данных.

В базе данных будем хранить следующую информацию:
  1. Таблица пользователей - код пользователя, имя пользователя, пароль доступа (в примерах к статье это поле не используется). В случае работ с базой данных Oracle полезно также хранить аккаунт пользователя (имя схемы пользователя).
  2. Таблица ролей - код роли, наименование роли. Роли введены для более компактного и прозрачного для понимания хранения информации о доступе. Гораздо экономичнее хранить соответствие компонент форм и пользователей опосредованно через роли. Так, например, несколько пользователей могут принадлежать одной роли.
  3. Таблица соответствия ролей и пользователей - код роли, код пользователя.
  4. Таблица компонент форм Delphi - имя формы, имя компонента, код роли. В этой таблице хранится соответствие компонент форм Delphi и ролей. Хранение может быть двух видов: а) храним те компоненты, к которым разрешен доступ; б) компоненты к которым доступ не разрешен. Представляется, что второй способ является более экономичным, хотя и менее понятен (конечно, логичнее хранить соответствие ролей и то, что разрешено для них) - в первом случае придется либо дополнительно хранить вообще все компоненты формы, либо программно отслеживать при инициализации доступ к таким компонентам формы как TLabel, TPanel и т.д. В статье реализован второй способ.

Реализация.

  Для реализации метода будем использовать класс TBaseForm, введенный в статье [1]. Внесем изменения в пакет 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.
Листинг 1. Юнит UntTypes.pas
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 для аккаунта пользователя.

Приложения.

package.zip - пакет с классом TBaseForm (Delphi6).
program.zip - база данных и пример программы, использующий описанный подход (Delphi6).

Список литературы

[1]
Рощупкин А.В. Не визуальное наследование форм в Delphi // Электронная публикация http://www.delphimaster.ru/articles/parentform/index.html
   Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи:  Рощупкин А.В.
  

Другие статьи Наверх


  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо