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

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

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

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

لماذا CEL؟

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

كمثال على توسيع نطاق الضبط التعريفي باستخدام CEL، يُرجى مراعاة إمكانات إدارة الهوية والوصول (IAM) في Google Cloud. في حين أنّ RBAC هي الحالة الشائعة، توفّر إدارة الهوية وإمكانية الوصول تعبيرات 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 هو تحليل التعبيرات والتحقّق منها في وقت الضبط وتخزين AST ثم استرداد قيمة AST وتقييمها بشكل متكرر في وقت التشغيل.

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

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

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

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

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

يحتاج مقيّم CEL إلى ثلاثة أشياء:

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

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