Про один спосіб розмежування прав користувачів в додатках 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>

*

*