سؤال

أنا أستخدم Grails لإنشاء تطبيق يعمل بشكل أساسي كإطار خدمة. سؤالي هو: هل يمكن تأمين الخدمات بنفس الطريقة مثل وحدات التحكم؟

مثال على أساس URI:

class SecurityFilters {
  def filters = {
    all(uri: "/**") {
      before = {
        // Ignore direct views (e.g. the default main index page).
        if (!controllerName) return true
        // Access control by convention. 
        accessControl()
      }
    } 
  } 
}
هل كانت مفيدة؟

المحلول

ليس لدي أي فكرة عما إذا كان المكون الإضافي Shiro يدعم هذا ، ولكن المكون الإضافي ACEGI لا ، وإن كان بطريقة "تجريبية" (مهما كان ذلك).

تحديث

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

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

النهج الأساسي هو:

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

جانبا

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

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