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

NestJS / المتوسط: السياسات والموائمات والمصادر / الدرس 8

الحراس والهويات وتفويض الكائن

ابن سياق هوية موثوقاً وطبق سياسة مجال مشتركة عبر HTTP والمداخل الأخرى.

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

أهداف الدرس

  • ميز المصادقة وبيانات المسار وأهلية الكائن.
  • استخدم سياق التنفيذ بقصد بدلاً من افتراض أن كل طلب HTTP.

الحارس موائم سياسة لا هوية تلقائية

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

افصل استخراج النقل عن السياسة المشتركة

يستخرج الجزء طلب HTTP من ExecutionContext ويفوض شرطاً عاماً لسياسة محقونة. هو خاص بـHTTP فلا ينسخ لمستهلك رسائل أو محلل GraphQL دون تكييف. تمثل principal عقد تطبيق يثبت خارج الجزء لا ضمان Nest مضمنًا. سجل الحارس بربط يمر بالحاوية إذا له اعتماد. وتفرض الخدمة قاعدة الكائن قبل الأثر، خصوصاً إذا وصل العامل للحالة دون الحارس. يوضح الجزء موضع الاستخراج لا كيفية إثبات الاعتماد أو تحديث الصلاحية بعد إلغاء دور المستخدم.

typescript موائم حارس HTTP توضيحي
@Injectable()
export class CatalogGuard implements CanActivate {
  constructor(private readonly policy: CatalogPolicy) {}
  canActivate(context: ExecutionContext) {
    const req = context.switchToHttp().getRequest();
    return this.policy.mayEnter(req.principal);
  }
}

تفترض الاستيرادات وبناء الهوية والسياسة ولم تنشئ Nest الحارس أو تستدعه.

حدد معنى تجاوز البيانات ووراثتها

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

اختبر الكائن نفسه بهويات مختلفة

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

javascript جدول سياسة كائن محلي كامل
function mayEdit(principal,course) {
  return principal.tenantId === course.tenantId && principal.roles.includes("editor");
}
const course={id:"c1",tenantId:"lab-a"};
console.assert(mayEdit({tenantId:"lab-a",roles:["editor"]},course));
console.assert(!mayEdit({tenantId:"lab-b",roles:["editor"]},course));
console.assert(!mayEdit({tenantId:"lab-a",roles:["viewer"]},course));

ينجح محرر المستأجر نفسه فقط ولا تختبر أصالة الهوية أو بيانات الحارس.

راجع المخبأ والسلطة الحالية

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

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

يمنح الدور تحريراً عابراً للمستأجر

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

لا تفرض علامة بيانات مخصصة شيئاً

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

يتجاوز عامل سياسة HTTP فقط

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

اختبر فهمك

1. لماذا يفشل مستخدم بدور viewer من المستأجر نفسه في قاعدة التحرير المحلية؟

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

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

2. لماذا لا يكفي اختبار حارس لحماية خدمة نشر تستخدمها عدة مداخل؟

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

يمكن لموائمات أخرى استدعاء الخدمة من دون المرور بذلك الحارس، وقد لا يكون الحارس قد حمل الكائن الحالي أصلاً. طبق أهلية المجال قبل الآثار، ثم اختبر ربط HTTP والاستدعاءات غير المعتمدة على HTTP كلّاً على حدة. يمنع ذلك اعتماد الأمن على تذكر المستدعي مزخرفاً معيناً على متحكم واحد.

أهم ما تعلمته

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

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