محتويات الدورة

GraphQL / المتوسط: السياسة والمصادر والعملاء / الدرس 7

محللات الحقول وسياق الطلب والتفويض

كيف خدمات المجال عبر المحللات مع اتساق الهوية وسياسة الكائن عبر مسارات الرسم.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • افصل قيمة الأب والوسائط والسياق وبيانات الحقل.
  • طبق سياسة مشتركة للمستأجر والكائن بدلاً من الثقة بالمداخل.

اجعل المحللات صغيرة والقواعد مشتركة

يكيف المحلل حقل مخطط واحداً مع قدرة تطبيق. يستقبل عادة في JavaScript قيمة الأب والوسائط المكرهة وسياق الطلب ومعلومات الحقل. قد يحمل السياق الهوية ووصول بيانات خاصاً بالطلب، ولا يصبح حقيبة عامة مشتركة قابلة للتغيير. ضع قواعد العمل في خدمة أو سياسة تستعملها المداخل الأخرى؛ وإلا حمي المقرر عبر Query.course وتجاوزتها author.courses.

اطلب خدمة ذات نطاق صريح

يمرر الجزء المستأجر والهوية لخدمة مجال بدلاً من تحميل سجل عام بالمعرف. ليس خادماً كاملاً؛ فالمصادقة والمخطط وتنفيذ الخدمة خارجه. تحدد الخدمة هل يصبح الكائن المحجوب null أو خطأ معتمداً دون تسريب وجوده. حافظ على توافق الإخراج ولا تلحق أسراراً لمجرد وجودها في الكيان.

javascript حد المحلل والسياسة
const resolvers = {
  Query: {
    course: (_parent, { id }, context) =>
      context.courses.findVisible({
        id, tenantId: context.principal.tenantId,
        principal: context.principal
      })
  }
};

يفوض المحلل الظهور لـfindVisible ويفترض هوية مصادقاً عليها ولا ينفذ المصادقة أو التخزين.

يجب أن يصمد التفويض عبر المسارات البديلة

يعرض الرسم مسارات متعددة للكيان لذلك لا تكفي فحوص الجذر. راجع عضوية القائمة والبحث والعلاقات وحمولة الطفرات بالقاعدة نفسها. قد يختلف تقييد الحقول؛ فالعنوان العام وعدد المسجلين الخاص يحتاجان قرارين على الكائن نفسه. تحدد المصادقة الهوية والتفويض الفعل المسموح الآن. لا تستنتج الوصول من مستأجر يقدمه العميل أو معرف صعب التخمين.

اختبر عزل المستأجر كشرط محلي

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

javascript جدول قرار ظهور محلي
function canRead(principal, course) {
  return principal.tenantId === course.tenantId &&
    course.state === "PUBLISHED";
}
const course = { id: "c1", tenantId: "lab-a", state: "PUBLISHED" };
console.assert(canRead({tenantId: "lab-a"}, course));
console.assert(!canRead({tenantId: "lab-b"}, course));
console.assert(!canRead({tenantId: "lab-a"}, {...course, state: "DRAFT"}));

تنجح التأكيدات الثلاثة لهذه القاعدة وحدها دون إثبات هوية النقل أو أمان التطبيق الكامل.

قيد عمر السياق وإفصاح الخطأ

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

الأخطاء الشائعة وإصلاحها

تكشف العلاقات مقرراً محجوباً

لماذا يحدث؟
طبق الظهور في الجذر فقط.
كيف تصلحه؟
استعمل السياسة نفسها لكل اجتياز وحمولة.
كيف تتجنب تكراره؟
اختبر المسارات البديلة للسجل نفسه.

يعيد محمل عام سجل مستأجر آخر

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

لا يوفر توجيه التفويض حماية

لماذا يحدث؟
افتقر التعريف لتنفيذ يفرضه.
كيف تصلحه؟
اربط تنفيذ السياسة واختبر الموائم.
كيف تتجنب تكراره؟
راجع التوجيهات كعقود كود لا ملصقات.

اختبر فهمك

1. البحث الجذري محمي. لماذا تختبر author.courses؟

اعرض الحل المشروح

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

2. ما الذي لا تثبته عينة الشرط المحلية؟

اعرض الحل المشروح

لا تثبت المصادقة وبناء الهوية أو أمان النقل أو كل الأدوار أو دمج GraphQL. تفحص ثلاث حالات لقاعدة محددة. يفيد ذلك في إعادة إنتاج القرار، ويلزم اختبارات الموائم والعملية قبل ادعاء أوسع.

أهم ما تعلمته

  • يجب أن تغطي سياسة الرسم كل طريق للكائن.
  • عمر السياق والمخبأ جزء من العزل.

المراجع الرسمية