لغة التعبير الشائعة (CEL)

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

تم تصميم CEL خصيصًا ليكون آمنًا عند تنفيذ رمز المستخدم. على الرغم من أنّ استدعاء الدالة eval() بشكل عشوائي في رمز Python الخاص بالمستخدم أمر خطير، يمكنك تنفيذ رمز CEL الخاص بالمستخدم بأمان. وبما أنّ CEL تمنع السلوك الذي قد يؤدي إلى انخفاض الأداء، يتم تقييمها بأمان في غضون أجزاء من الثانية أو أجزاء من المليون من الثانية. تُعدّ CEL مثالية للتطبيقات التي تتطلّب أداءً عاليًا، وذلك بفضل سرعتها وأمانها.

تقيِّم CEL التعبيرات المشابهة للدوال ذات السطر الواحد أو تعبيرات lambda. على الرغم من أنّ CEL تُستخدَم عادةً لاتّخاذ قرارات منطقية، يمكنك أيضًا استخدامها لإنشاء عناصر أكثر تعقيدًا، مثل رسائل JSON أو بروتوكول المخزن المؤقت.

لماذا CEL؟

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

كمثال على توسيع إعدادات تعريفية باستخدام CEL، ضع في اعتبارك إمكانات إدارة الهوية وإمكانية الوصول (IAM) في Google Cloud. على الرغم من أنّ التحكّم المستند إلى الأدوار هو الحالة الشائعة، توفّر خدمة "إدارة الهوية وإمكانية الوصول" تعبيرات CEL للسماح للمستخدمين بفرض قيود إضافية على نطاق الإذن المستند إلى الأدوار وفقًا لخصائص رسالة النموذج الأولي للطلب أو الموارد التي يتم الوصول إليها. سيؤدي وصف هذه الشروط من خلال نموذج البيانات إلى إنشاء مساحة معقّدة لواجهة برمجة التطبيقات يصعب التعامل معها. بدلاً من ذلك، يُعدّ استخدام CEL مع التحكّم في الوصول المستند إلى السمات (ABAC) إضافة تعبيرية وقوية إلى التحكّم في الوصول المستند إلى الدور (RBAC).

المفاهيم الأساسية للغة CEL

في CEL، يتم تجميع تعبير مقابل بيئة. تنتج خطوة التحويل البرمجي شجرة تحليل مجرّدة (AST) بتنسيق مخزن مؤقت للبروتوكول. يتم تخزين التعبيرات المجمّعة لاستخدامها في المستقبل بهدف إبقاء عملية التقييم بأسرع ما يمكن. يمكن تقييم تعبير مجمَّع واحد باستخدام العديد من المدخلات المختلفة.

في ما يلي نظرة عن كثب على بعض هذه المفاهيم.

التعبيرات

يكتب المستخدمون التعابير. التعبيرات مشابهة لنصوص الدوال ذات السطر الواحد أو تعبيرات lambda. تتم كتابة توقيع الدالة الذي يعرّف الإدخال خارج تعبير CEL، ويتم استيراد مكتبة الدوال المتاحة لـ CEL تلقائيًا.

على سبيل المثال، يأخذ تعبير CEL التالي عنصر طلب، ويتضمّن الطلب رمزًا مميزًا claims. يعرض التعبير قيمة منطقية تشير إلى ما إذا كان الرمز المميّز claims لا يزال صالحًا.

مثال على تعبير CEL لمصادقة رمز مميّز للمطالبات

// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
//   claims - authentication claims.
//   now    - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now

بينما يحدّد المستخدمون تعبير CEL، تحدّد الخدمات والتطبيقات البيئة التي يتم تشغيل التعبير فيها.

البيئات

يتم تحديد البيئات حسب الخدمات. تُعلن الخدمات والتطبيقات التي تتضمّن CEL عن بيئة التعبير. البيئة هي مجموعة المتغيرات والدوال التي يمكن استخدامها في تعبيرات CEL.

على سبيل المثال، يعرّف الرمز textproto التالي بيئة تحتوي على المتغيّرَين request وnow باستخدام الرسالة CompileRequest من خدمة CEL.

مثال على بيان بيئة CEL

# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
  name: "request"
  ident {
    type { message_type: "google.rpc.context.AttributeContext.Request" }
  }
}
declarations {
  name: "now"
  ident {
    type { well_known: "TIMESTAMP" }
  }
}

يستخدم مدقق الأنواع في CEL الإعدادات المستندة إلى النموذج الأوّلي للتأكّد من أنّ جميع مراجع المعرّفات والدوال ضمن تعبير ما تم تعريفها واستخدامها بشكل صحيح.

مراحل معالجة التعبيرات

تتم معالجة تعابير CEL على ثلاث مراحل:

  1. تحليل
  2. شيك
  3. تقييم

إنّ النمط الأكثر شيوعًا لاستخدام CEL هو تحليل العبارات والتحقّق منها في وقت الإعداد، وتخزين شجرة البنية المجردة، ثم استرداد شجرة البنية المجردة وتقييمها بشكل متكرّر في وقت التشغيل.

رسم توضيحي لمراحل معالجة CEL

يتم تحليل العبارات والتحقّق منها في مسارات الإعدادات، ثم يتم تخزينها وتقييمها استنادًا إلى سياق واحد أو أكثر في مسارات القراءة.

يتم تحليل CEL من تعبير يمكن قراءته إلى شجرة بنية مجردة (AST) باستخدام قواعد تحليل معجمي وقواعد تحليل ANTLR. وتنتج مرحلة التحليل شجرة بنية مجردة مستندة إلى بروتوكول، حيث يحتوي كل عقدة Expr في شجرة البنية المجردة على رقم تعريف صحيح يُستخدم للفهرسة في البيانات الوصفية التي يتم إنشاؤها أثناء التحليل والتدقيق. يمثّل ملف syntax.proto الذي يتم إنشاؤه أثناء عملية التحليل التمثيل المجرد لما تم إدخاله في شكل سلسلة من العبارات.

بعد تحليل التعبير، يتم التحقّق من نوعه مقارنةً بالبيئة للتأكّد من أنّه تم تعريف جميع معرّفات المتغيرات والدوال في التعبير ويتم استخدامها بشكل صحيح. ينتج مدقق الأنواع ملف checked.proto يتضمّن بيانات وصفية حول تحديد النوع والمتغير والدالة، ما يمكن أن يحسّن بشكل كبير من كفاءة التقييم.

أخيرًا، بعد تحليل العبارة والتحقّق منها، يتم تقييم شجرة البنية المجردة المخزّنة.

يحتاج مقيّم CEL إلى ثلاثة عناصر:

  • عمليات ربط الدوال لأي إضافات مخصّصة
  • ربط المتغيرات
  • شجرة بنية مجردة (AST) لتقييمها

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