ما هي أفضل طريقة للتعامل مع عدة إذن أنواع ؟

StackOverflow https://stackoverflow.com/questions/1451

  •  08-06-2019
  •  | 
  •  

سؤال

أنا غالبا ما تواجه السيناريو التالي حيث كنت في حاجة إلى توفر العديد من أنواع مختلفة من الأذونات.أنا في المقام الأول استخدام ASP.NET / VB.NET مع SQL Server 2000.

السيناريو

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

في الماضي, وقد اخترت واحدة من الطريقتين التاليتين وأنا أعلم أن تفعل هذا.

  1. استخدام واحد إذن الجدول مع الأعمدة التي تستخدم تحديد كيفية تطبيق المعايير.خاصة في الأعمدة هذا المثال هي 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. استخدام الخرائط جدول لكل نوع من الإذن ، ثم الانضمام لهم كل ذلك معا.

    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
    

أفكاري

أتمنى أن الأمثلة معنى.أنا مرقع معا.

المثال الأول يتطلب عمل أقل, لكن لا أحد منهم يشعر وكأنه أفضل إجابة.هل هناك طريقة أفضل للتعامل مع هذا ؟

هل كانت مفيدة؟

المحلول

أنا أتفق مع جون داوني.

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

"[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}"

ثم يمكنك الجمع بين عدة ضوابط استخدام و المعامل المشغل.

على سبيل المثال, إذا كان يمكن للمستخدم عرض وتحرير المستخدمين الثنائية نتيجة العملية 0000 0011 التي تم تحويلها إلى عشري هو 3.
ثم يمكنك تخزين إذن من مستخدم واحد في عمود واحد من قاعدة البيانات الخاصة بك (في هذه الحالة سيكون 3).

داخل التطبيق الخاص بك تحتاج فقط آخر أحادي المعامل العملية (أو) للتحقق مما إذا كان المستخدم لديه معين إذن أم لا.

نصائح أخرى

بالمناسبة أنا عادة أذهب عن الترميز إذن النظم هو وجود 6 الجداول.

  • المستخدمين - هذه هي جميلة على التوالي إلى الأمام هو نموذجي المستخدمين الجدول
  • المجموعات - هذا سيكون مرادفا الإدارات الخاصة بك
  • أدوار - هذا هو الجدول مع كافة الأذونات عموما أيضا بما في ذلك الإنسان للقراءة اسم و وصف
  • Users_have_Groups - وهذا هو كثير إلى كثير من الجدول ما مجموعات المستخدم ينتمي إلى
  • Users_have_Roles - أخرى كثيرة لكثير من الجدول ما الأدوار التي تسند إلى فرد المستخدم
  • Groups_have_Roles النهائية كثير إلى كثير من الجدول ما الأدوار لكل فريق

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

كما قلت هذا هو ما أفعل عادة ولكن millage قد تختلف.

بالإضافة إلى جون داوني و jdecuyper حلول, لقد أضاف أيضا واضحة "تنكر" بت في نهاية/بداية bitfield ، بحيث يمكنك تنفيذ المضافة أذونات المجموعة, دور العضوية ، ومن ثم طرح أذونات على أساس رفض واضح إدخالات مثل NTFS يعمل إذن الحكمة.

بصراحة ASP.NET عضوية / أدوار الميزات ستعمل تماما عن السيناريو الذي وصفته أنت.كتابة الجداول / procs / دروس عملية كبيرة و يمكنك الحصول على لطيفة جدا السيطرة على التفاصيل الدقيقة ، ولكن بعد أن أفعل هذا بنفسي لقد خلصت إلى أنه من الأفضل أن مجرد استخدام المدمج في .صافي الأشياء.الكثير من التعليمات البرمجية الموجودة يهدف إلى العمل حوله وهو لطيف في بئر.كتابة من الصفر أخذت مني حوالي 2 أسابيع وكان لا يوجد فيها بالقرب قوية كما .الشباك.عليك أن رمز الكثير من حماقة (استعادة كلمة السر, تأمين السيارات, التشفير, أدوار, إذن واجهة طن من procs ، إلخ) و الوقت يمكن أن تنفق بشكل أفضل في أماكن أخرى.

آسف إذا أنا لم أجيب على سؤالك, أنا مثل الرجل الذي يقول أن تعلم c# عندما يسأل شخص ما vb السؤال.

نهج لقد استخدامها في مختلف التطبيقات هو أن يكون عام PermissionToken الدرجة التي للتغيير قيمة العقار.ثم يمكنك الاستعلام عن الطلب ، فإنه يقول لك الذي PermissionTokens اللازمة من أجل استخدامها.

على سبيل المثال ، فإن الشحن قد أقول لك أنه يحتاج:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top