أفضل الممارسات للتعامل مع أنواع متعددة من الأذونات في تطبيقات ASP.NET

يمكن أن تكون إدارة الأذونات في التطبيقات الويب مهمة شاقة، خصوصًا مع زيادة عدد التطبيقات وأدوار المستخدمين. عند مواجهة ضرورة تقديم أنواع مختلفة من الأذونات للمستخدمين أو الأقسام بشكل ديناميكي، يسعى المطورون غالبًا إلى حلول فعالة وقابلة للتوسع. في هذه التدوينة، سنستعرض بعض أفضل الممارسات للتعامل مع أنواع متعددة من الأذونات داخل تطبيق ASP.NET، مع التركيز على السيناريوهات الشائعة في بيئات SQL Server.

فهم سيناريو الأذونات

في العديد من التطبيقات، تعتبر الأذونات حيوية للتحكم في الوصول إلى الموارد. على سبيل المثال، تخيل أنك تريد السماح بالوصول إلى تطبيق معين بناءً على معرف المستخدم أو معرف القسم. مع نمو تطبيقك، يصبح من المهم الحفاظ على الوضوح وتبسيط إدارة هذه الأذونات. طريقتان شائعتان يستخدمهما المطورون تتضمنان إما جدول أذونات واحد مع أعمدة خاصة أو جدول تخطيطي لكل نوع من الأذونات. ومع ذلك، قد لا يشعر أي من هذين النهجين بالكفاءة المثلى.

النهجان الشائعان لإدارة الأذونات

  1. جدول أذونات واحد مع أعمدة خاصة:

    • تشمل هذه الطريقة استخدام جدول واحد (application_permissions) حيث يتم استخدام أعمدة خاصة (TypeID و TypeAuxID) للإشارة إلى نوع الإذن ومعرفه المرتبط، على التوالي.
    • قد يبدو استعلام SQL للتحقق من الأذونات كما يلي:
      SELECT COUNT(PermissionID)
      FROM application_permissions
      WHERE
      (TypeID = 1 AND TypeAuxID = @UserID) OR
      (TypeID = 2 AND TypeAuxID = @DepartmentID)
      AND ApplicationID = 1
      
    • على الرغم من بساطتها، يمكن أن تعقد هذه الطريقة من منطق الاستعلام مع زيادة أنواع الأذونات.
  2. جداول تخطيط لكل نوع من الأذونات:

    • بدلاً من ذلك، يمكنك إنشاء جداول تخطيط منفصلة لأذونات المستخدمين وأذونات الأقسام، مع ربطها عبر joins.
    • إليك مثال على استعلام SQL يعكس هذا النهج:
      SELECT COUNT(perm.PermissionID)
      FROM application_permissions perm
      LEFT JOIN application_UserPermissions emp
      ON perm.ApplicationID = emp.ApplicationID
      LEFT JOIN application_DepartmentPermissions dept
      ON perm.ApplicationID = dept.ApplicationID
      WHERE q.SectionID=@SectionID
        AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
       (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
      ORDER BY q.QID ASC
      
    • توفر هذه الطريقة مرونة ولكنها قد تصبح مرهقة مع إدخال المزيد من الجداول.

حل عملي: التعدادات المميزة للأذونات

بعد مراجعة النهجان الشائعين، تعتبر إحدى التقنيات الفعالة هي الاستفادة من التعدادات المميزة. تبسط هذه الطريقة من معالجة الأذونات باستخدام عمليات bitwise. إليك تحليل للحل:

كيف تعمل التعدادات المميزة

  1. تحديد الأذونات:

    • قم بتحديد أذوناتك باستخدام تعداد مع خاصية [Flags]. يسمح ذلك بدمج الأذونات الفردية في قيمة عددية واحدة.
    [Flags]
    public enum Permission {
        VIEWUSERS = 1,   // 00000001
        EDITUSERS = 2,   // 00000010
        VIEWPRODUCTS = 4, // 00000100
        EDITPRODUCTS = 8, // 00001000
        VIEWCLIENTS = 16, // 00010000
        EDITCLIENTS = 32, // 00100000
        DELETECLIENTS = 64 // 01000000
    }
    
  2. دمج الأذونات:

    • يمكن دمج الأذونات باستخدام عمليات bitwise. على سبيل المثال، إذا كان لدى المستخدم أذونات لمشاهدة وتحرير المستخدمين:
    int combinedPermissions = (int)(Permission.VIEWUSERS | Permission.EDITUSERS); // الناتج: 3
    
  3. تخزين وفحص الأذونات:

    • يمكن تخزين هذه القيمة العددية الفردية (مثل 3 لأذونات العرض والتحرير) بسهولة في عمود قاعدة البيانات.
    • يمكن إجراء فحص الأذونات باستخدام عملية bitwise أخرى (OR) لمعرفة ما إذا كان إذن معين محددًا:
    bool hasViewUsersPermission = (combinedPermissions & (int)Permission.VIEWUSERS) != 0; // تعيد true أو false
    

مزايا التعدادات المميزة

  • الكفاءة: يتم تخزين الأذونات كقيمة واحدة، مما يجعل عمليات قاعدة البيانات أكثر كفاءة.
  • البساطة: فحص الأذونات سهل مع عمليات bitwise، مما يبسط التدفق المنطقي في تطبيقك.
  • التوسع: يمكن إضافة أذونات جديدة بسهولة دون إعادة هيكلة الجداول أو تعديل الاستعلامات بشكل كبير.

الخاتمة

يمكن أن تكون إدارة أنواع متعددة من الأذونات في تطبيقات ASP.NET معقدة، لكن باستخدام الاستراتيجيات الصحيحة يمكن أن تبسط العملية بشكل كبير. من خلال الاستفادة من التعدادات المميزة وعمليات bitwise، يمكنك إنشاء نظام أذونات ديناميكي قوي ومرن ينمو مع تطبيقك. لا تبسط هذه الطريقة فقط التفاعلات مع قاعدة البيانات، بل تجعل أيضًا الحفاظ على الوصول إلى المستخدمين الأمر سهلًا مع توسع تطبيقك.

قم بتطبيق هذه الممارسات في تطبيقاتك الخاصة لتعزيز الأمان وتحسين تجربة المستخدم بشكل عام!