Про один спосіб розмежування прав користувачів в додатках Delphi (документація, вихідні коди), Документація, Програмування, статті

Анотація.

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

База даних.


У базі даних будемо зберігати наступну інформацію:


  1. Таблиця користувачів – код користувача, ім’я користувача, пароль доступу (в прикладах до статті це поле не використовується). У разі робіт з базою даних Oracle корисно також зберігати аккаунт користувача (Ім’я схеми користувача).
  2. Таблиця ролей – код ролі, найменування ролі. Ролі введені для більш компактного і прозорого для розуміння зберігання інформації про доступ. Набагато економніше зберігати відповідність компонент форм і користувачів опосередковано через ролі. Так, наприклад, кілька користувачів можуть належати одній ролі.
  3. Таблиця відповідності ролей і користувачів – код ролі, код користувача.
  4. Таблиця компонент форм Delphi – ім’я форми, ім’я компонента, код ролі. У цій таблиці зберігається відповідність компонент форм Delphi і ролей. Зберігання може бути двох видів: а) зберігаємо ті компоненти, до яких дозволений доступ; б) компоненти до яких доступ не дозволено. Видається, що другий спосіб є більш економічним, хоча і менш зрозумілий (звичайно, логічніше зберігати відповідність ролей і те, що дозволено для них) – в першому випадку доведеться або додатково зберігати взагалі всі компоненти форми, або програмно відслідковувати при ініціалізації доступ до таких компонентів форми як TLabel, TPanel і т.д. У статті реалізований другий спосіб.

Реалізація.

Для реалізації методу будемо використовувати клас 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.
Лістинг 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 для аккаунта користувача.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*