سؤال

أقوم بإنشاء تطبيق ويب مع التحكم في الوصول المستند إلى الدور باستخدام أمان Acegi (Spring).لذلك لدي مستخدمين مختلفين بأدوار: ROLE_ADMIN, ROLE_USER وإلخ.
ومع ذلك، أنا بحاجة إلى تنفيذ قيود المستخدم المختلفة.

دعونا نفكر في مثال:

لنفترض أن هناك موقعًا حيث يمكن للمستخدمين مشاهدة الأفلام عبر الإنترنت.هناك مستخدمون لديهم أدوار ROLE_STANDARD_USER و ROLE_VIP_USER.يمكن للمستخدمين العاديين مشاهدة 3 أفلام في الأسبوع ويمكن لمستخدمي VIP مشاهدة 10 أفلام في الأسبوع بالإضافة إلى بعض الامتيازات الأخرى.ويوجد مستخدم واحد في مجموعة المستخدمين القياسية وأريد أن أقدم له فيلمين إضافيين في الأسبوع.قد يتغير عدد الأفلام المسموح بها في بعض الأحيان.
هناك أيضًا فئات مختلفة من الأفلام:أفلام الخيال والكوميديا ​​والكلاسيكية والأفلام الجديدة وما إلى ذلك.وأريد أن يتمكن بعض المستخدمين، بغض النظر عن دورهم، من الوصول إلى فئات معينة فقط.يمكن إنشاء الفئات وإزالتها ديناميكيًا.

هل هناك أي ممارسات قياسية لتنفيذ هذا النوع من قيود المستخدم؟
هل يمكن/ينبغي القيام بذلك باستخدام أدوار وأذونات Spring Security؟
أو أحتاج إلى التفكير في إضافة محرك قائم على القواعد إلى تطبيقي؟

شكرًا لك.

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

تحرير 2

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

شكرا لجميع الاقتراحات!

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

المحلول

لا أتوقع أن يوفر نظام أمني تصريحي قائم على الأدوار التحكم الدقيق الذي تسعى إليه.لقد قمت بالفعل بوصف عدد لا بأس به من عناصر التحكم في الوصول المستندة إلى "قواعد العمل" والتي تريد تنفيذها وقد نتوقع بمرور الوقت أن تصبح هذه القواعد أكثر تعقيدًا.لذا فأنت بحاجة إلى مجموعة من المعلومات من نظام الأمان الفرعي (من هو المستخدم لهذا الطلب؟ما هي الأدوار التي لديهم؟) ولكن بعد ذلك قم بدمج ذلك برمجيًا مع بيانات وقواعد العمل (يحق لهذا المستخدم الحصول على فيلمين مجانيين إذا كان تاريخ اليوم يقع في هذا النطاق).

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

نصائح أخرى

قبل أن تسأل نفسك ما إذا كان Acegi (أو محرك القواعد وما إلى ذلك) هو المكان الصحيح للقيام بذلك، أعتقد أنك بحاجة إلى
تحليل احتياجاتك بدقة وبشكل كامل.

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

مثال أ نموذج لاحتياجاتك:

  • حدد عدد الأفلام العامة في الأسبوع وفقًا لـ مجموع:
    • الدور (3 أو 10)
    • مكافأة لكل مستخدم (الافتراضي 0 إذا لم يتم ذكرها)
  • قم بتحديث هذه الأرقام حسب الحاجة
  • تقييد الأفلام بقائمة الفئات:
    • إذا تم تحديد قائمة للمستخدم، استخدمها
    • وإلا، استخدم القائمة المتوفرة للدور

هذا المثال له دلالات كثيرة، قد تكون صحيحة أو غير مقبولة في حالتك.
تداعيات:

  • بعد تحديث الرقم، يتم تغيير الحد على الفور.
  • لا توجد ذاكرة للحدود الأسبوعية، لا يمكنك أن تطلب ذلك للماضي (لعمل إحصائيات على سبيل المثال)
  • ...

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

إذا كنت تفكر في Spring Security، فهذه إحدى الطرق التي أرى أنك يمكنك من خلالها تنفيذ الحل الخاص بك.تنفيذ أ AccessDecisionVoter لاتخاذ قرار بشأن وصول المستخدم.ألق نظرة على المصدر المرجعي هنا

انظر أيضًا إلى [javadoc] [2] لـ AccessDecisionVoter.يمكنك تنفيذ القواعد الخاصة بك عن طريق تنفيذ vote طريقة.

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

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

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote(org.springframework.security.Authentication, ، java.lang.Object، org.springframework.security.ConfigAttributeDefinition)

يبدو أن لديك احتياجات مصادقة واحتياجات ترخيص - في كثير من الأحيان يخلط الأشخاص بين الاثنين و/أو ينضمون إليهما.والحمد لله أن Spring Security يحدد الاثنين بشكل جيد للغاية.سوف يقوم المستخدم الخاص بك بالمصادقة من خلال سلسلة الأمان (سواء كان ذلك نموذج logj أو openID أو SSL X509) ثم بمجرد الانتهاء من ذلك، سيتم تفويضه من قبل الناخبين المحددين لشركتك (في AccessDecisionManagers) فيما يتعلق بما إذا كانوا قد شاهدوا الرقم المخصص لهم أم لا من الأفلام.إذا كانت هناك حاجة إلى إضافة منطق عمل جديد لاحقًا، فالأمر ببساطة يتعلق بكتابة ناخبين جدد/المزيد وإدراجهم في مديرك.

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