أنواع (أدوار) أذونات متعددة مخزنة في قاعدة البيانات كعلامة عشرية واحدة

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

  •  09-06-2019
  •  | 
  •  

سؤال

كنت سأطرح سؤالاً هنا حول ما إذا كان تصميمي لبعض جداول قاعدة بيانات المستخدمين/الأدوار مقبولاً أم لا، ولكن بعد إجراء بعض الأبحاث، صادفت هذا السؤال:

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

يبدو الأمر وكأنه نهج مبتكر، لذا بدلاً من جدول users_to_roles ذو علاقة متعدد إلى متعدد، لدي أذونات متعددة محددة على أنها رقم عشري واحد (أفترض نوع البيانات int).وهذا يعني أن جميع الأذونات لمستخدم واحد موجودة في صف واحد.ربما لن يكون الأمر منطقيًا حتى تقرأ السؤال والإجابة الأخرى

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

هذه هي الإجابة الأصلية في حالة حذف السؤال الآخر:

"شخصيًا، أستخدم أحيانًا تعدادًا مميزًا للأذونات.بهذه الطريقة يمكنك استخدام عمليات AND وOR وNOT و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
}

وبعد ذلك، يمكنك الجمع بين عدة أذونات باستخدام عامل التشغيل AND.

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

داخل تطبيقك، تحتاج فقط إلى عملية بت أخرى (OR) للتحقق مما إذا كان المستخدم لديه إذن معين أم لا."

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

المحلول

يمكنك استخدام عمليات bitwise.سيكون الرمز الزائف شيئًا مثل:

bool HasPermission(User user, Permission permission) {
    return (user.Permission & permission) != 0;
}

void SetPermission(User user, Permission permission) {
    user.Permission |= permission;
}

void ClearPermission(User user, Permission permission) {
    user.Permission &= ~permission;
}

الإذن هو نوع التعداد المحدد في منشورك، على الرغم من أن أي نوع يجب أن يعتمد على نوع يشبه العدد الصحيح.الأمر نفسه ينطبق على حقل User.Permission.

إذا كانت هذه العوامل (&، |=، و&=) غير منطقية بالنسبة لك، فاقرأ عن عمليات البت (bitwise AND وbitwise OR).

نصائح أخرى

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

إذا كنت ستفعل شيئًا كهذا، فستستفيد حقًا من وجود جدول الأرقام.سيجعل حساباتك أسرع بكثير.

يتضمن الإعداد الأساسي الجداول التالية:

  1. المجموعات - للقيام بالعديد من المستخدمين ونقاط الأمان
  2. نقاط الأمان - التي تحتوي على قيمة للترخيص المجهول وقيمة للمستخدمين المصادق عليهم الذين ليسوا جزءًا من مجموعة منفصلة
  3. جدول الانضمام لنقطة أمان المجموعة
  4. جدول أرقام BitMask خاص يحتوي على إدخالات لقيم ^2.وبالتالي هناك إدخال واحد لـ 2 (2) ومدخلين لثلاثة (2 و1).وهذا يمنعنا من الاضطرار إلى حساب القيم في كل مرة.

أولاً نحدد ما إذا كان المستخدم قد قام بتسجيل الدخول أم لا.إذا لم يكونوا كذلك، فإننا نعيد التفويض المجهول لنقطة الأمان.

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

ملحوظة: إذا لم يحصل مستخدم مجهول على حق الوصول، فإن الواجهة تنقله إلى مربع تسجيل الدخول للسماح له بتسجيل الدخول والمحاولة مرة أخرى.

إذا كان المستخدم يكون عضوًا في مجموعة واحدة أو أكثر، ثم نقوم بتحديد قيم مميزة من جدول BitMask لكل قيمة من القيم المحددة للمجموعات.على سبيل المثال، إذا كنت تنتمي إلى ثلاث مجموعات وكان لديك مستوى ترخيص واحد هو 8، ومستوى ترخيص واحد هو 12 والأخير 36، فإن تحديدنا مقابل جدول Bit Mask سيرجع 8 و8 و4 و4 و32 على التوالي.من خلال إجراء تمييز، نحصل على الرقم 4 و8 و32 الذي يقوم بتبديل الأقنعة بشكل صحيح إلى 101100.

يتم إرجاع هذه القيمة كمستوى ترخيص المستخدمين ومعالجتها بواسطة موقع الويب.

منطقي؟

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