باستخدام شيرو لتأمين الخدمات في الكأس
سؤال
أنا أستخدم 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) لإجراء عمليات تفتيش التفويض بدلاً من التدحرج على الطريقة الموضحة أعلاه.