السلام عليكم...
أعتقد أن أفضل طريقة هي استعمال حقل للصلاحيات (في جدول المستخدمين) و يكون نوع الحقل مفكرة أو مذكرة (Memo). ثم استعمال الدوال التالية لمعالجة الصلاحيات. بهذه الطريقة لن تكون مقيداً بعدد محدود من الصلاحيات، و يمكنك أن تزيد بعد ذلك في الصلاحيات دون الحاجة إلى تعديل الجدول في قاعدة البيانات.
أ. نفرض أن جول المستخدمين اسمه Users و يتكون من الحقول التالية:
1. UserID
2. UserName
3. Password
4. Authorities الصلاحيات
ب. في القسم interface لكود النافذة الرئيسية أو unit عامة قم بتعريف الصلاحيات كثوابت مع إعطائها قيماً متسلسلة ابتداءً من الواحد. مثلاً:
كود :
const
AUTH_ADD_NEW = 1; // إضافة بيانات
AUTH_MODIFY = 2; // تعديل بيانات
AUTH_DELETE = 3; // حذف بيانات
AUTH_PRINT_INVOICE = 4; // طباعة فاتورة
AUTH_PRINT_SALES_REPORT = 5; // طباعة تقرير المبيعات
AUTH_BACKUP = 6; // نسخ احتياطي
AUTH_RESTORE = 7; // استعادة بيانات
// إلخ
ج. قم بتعريف متغير يمثل صلاحيات المستخدم الذي قام بتسجيل الدخول، مثلاً:
كود :
var
UserAuths: string;
*** و طبعاً ستضبط قيمة هذا المتغير عند تسجيل الدخول حسب ما هو محفوظ في سجل المستخدم في قاعدة البيانات.
د. ضع التصريحات التالية في القسم interface:
كود :
procedure GiveAuthority(var Authorities: string; Index: Integer);
procedure DeleteAuthority(var Authorities: string; AuthCount, Index: Integer);
procedure GiveAllAuthorities(var Authorities: string);
procedure DeleteAllAuthorities(var Authorities: string);
function UserHasAuthority(Authorities: string; Index: Integer): Boolean;
هـ. في القسم implementation ضع تعريفات الإجراءات و الدوال السابقة:
كود :
procedure GiveAuthority(var Authorities: string; Index: Integer);
var
Auths: string;
AuthLen: Integer;
begin
if Index < 1 then
Exit;
Auths := UpperCase(Trim(Authorities));
if Auths = 'A' then
Exit
else if Auths = 'N' then
Auths := '';
AuthLen := Length(Auths);
if Index <= AuthLen then
Auths := StuffString(Auths, Index, 1, 'T')
else
Auths := Auths + StringOfChar('F', Index - AuthLen - 1) + 'T';
if Pos('F', Auths) = 0 then
Authorities := 'A'
else
Authorities := Auths;
end;
procedure DeleteAuthority(var Authorities: string; AuthCount, Index: Integer);
var
Auths: string;
AuthLen: Integer;
begin
if Index < 1 then
Exit;
Auths := UpperCase(Trim(Authorities));
if Auths = 'N' then
Exit
else if Auths = 'A' then
Auths := StringOfChar('T', AuthCount);
AuthLen := Length(Auths);
if Index <= AuthLen Then
Auths := StuffString(Auths, Index, 1, 'F')
else
Auths := Auths + StringOfChar('F', Index - AuthLen - 1) + 'F';
if Pos('T', Auths) = 0 then
Authorities := 'N'
else
Authorities := Auths;
end;
procedure GiveAllAuthorities(var Authorities: string);
begin
Authorities := 'A';
end;
procedure DeleteAllAuthorities(var Authorities: string);
begin
Authorities := 'N';
end;
function UserHasAuthority(Authorities: string; Index: Integer): Boolean;
var
Auths: string;
AuthLen: Integer;
begin
if Index < 1 then
Result := False
else begin
Auths := UpperCase(Trim(Authorities));
AuthLen := Length(Auths);
if Auths = '' then
Result := False
else if Auths = 'N' then
Result := False
else if Auths = 'A' then
Result := True
else if Index > AuthLen then
Result := False
else if Copy(Auths, Index, 1) = 'T' then
Result := True
else
Result := False;
end;
end;
*** في الأكواد السابقة: الصلاحيات يمكن أن تكون:
- A تشير إلى All أي لديه كل الصلاحيات.
- N تشير إلى None أي ليس لديه أية صلاحيات.
- سلسلة من حروف T و F حيث مث الـ T و جود الصلاحية، و تمثل الـ F عدم وجود الصلاحية.
*** و الدوال تعمل كالتالي:
* الإجراء GiveAuthority لمنح المستخدم إحدى الصلاحيات:
كود :
GiveAuthority(UserAuths, AUTH_PRINT_SALES_REPORT);
* الإجراء DeleteAuthority لسحب إحدى الصلاحيات:
كود :
DeleteAuthority(UserAuths, 20, AUTH_PRINT_SALES_REPORT);
// حيث 20 - مثلاً - عدد الصلاحيات في برنامجك
* الإجراء GiveAllAuthorities: لمنح المستخدم كافة الصلاحيات:
كود :
GiveAllAuthorities(UserAuths)
* الإجراء DeleteAllAuthorities: لإزالة كافة الصلاحيات:
كود :
DeleteAllAuthorities(UserAuths)
* الدالة UserHasAuthority لمعرفة ما إذا كان المستخدم يملك إحدى الصلاحيات أم لا. هذه الدالة تعيد True أو False:
كود :
if UserHasAuthority(UserAuths, AUTH_BACKUP) then begin
// ...
// إجراءات النسخ الاحتياطي
// ...
end
else
ShowMessage('ليس من صلاحياتك إجراء النسخ الاحتياطي');
نرجو الاستفادة و السلام.