قوائم ACL في الخريطة

لضمان أنّ المستخدمين الذين لديهم إذن الوصول إلى عنصر معيّن هم فقط من يمكنهم رؤية هذا العنصر ضمن نتيجة بحث، عليك فهرسة العناصر باستخدام قوائم التحكّم بالوصول (ACL) الخاصة بها من مستودع المؤسسة. يجب تصميم قوائم التحكّم بالوصول الخاصة بمستودعك وتضمينها عند فهرسة العناصر في المستودع. توفّر حزمة تطوير البرامج (SDK) الخاصة بأداة Content Connector مجموعة كبيرة من طرق قوائم التحكّم بالوصول (ACL) التي تتميّز بفعالية كافية لتصميم قوائم التحكّم بالوصول الخاصة بمعظم المستودعات.

إنشاء قائمة ACL

يتطلّب إنشاء قائمة التحكّم بالوصول خطوتَين:

  1. أنشئ Principal باستخدام الإجراءات الثابتة في فئة ACL.
  2. استخدِم فئة Acl.Builder لإنشاء قائمة التحكّم بالوصول باستخدام الجهة الرئيسية.

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

إنشاء كيان أساسي باستخدام معرّف خارجي

تتطلّب خدمة Google Cloud Search أن يتم ربط المستخدمين والمجموعات بعنوان بريد إلكتروني على Google. عند فهرسة عناصر المستودع، قد لا تتضمّن أدوات ربط المحتوى عناوين البريد الإلكتروني هذه. ومع ذلك، يتيح لك Content Connector SDK استخدام أي معرّف خارجي (معرّف يمنح مستخدمًا أو مجموعة إذن الوصول إلى عناصر المستودع)، بدلاً من عنوان البريد الإلكتروني، لفهرسة عنصر. استخدِم طريقة getUserPrincipal() أو طريقة getGroupPrincpal() لإنشاء كيانات أساسية تحتوي على معرّفات خارجية. تتوفّر عدة طرق ثابتة أخرى في فئة ACL تُستخدَم لإنشاء عناصر Principal.

اكتساب الأذونات من قائمة التحكم بالوصول

يشير توريث قائمة التحكّم بالوصول إلى إذن الوصول إلى عنصر معيّن ومستخدِم معيّن، استنادًا إلى نتيجة الجمع بين قوائم التحكّم بالوصول الخاصة بالعنصر وقوائم التحكّم بالوصول الخاصة بسلسلة التوريث. تعتمد القواعد المستخدَمة لاتخاذ قرار بشأن التفويض على المستودع وخصائص العنصر.

ضبط الإذن الموروث

يمكن أن يتضمّن كل عنصر الجهات الرئيسية المسموح بها مباشرةً والجهات الرئيسية المرفوضة مباشرةً، ويتم تحديدها باستخدام الطريقتَين setReaders() و setDeniedReaders(). المستخدم الأساسي المسموح به بشكل مباشر هو مستخدم تم تحديده في قائمة التحكم بالوصول (ACL) تمنحه إذن الوصول المباشر إلى عنصر معيّن. المستخدم المرفوض بشكل مباشر هو مستخدم تم تحديده في قائمة التحكّم بالوصول (ACL) على أنّه لا يملك إذن الوصول إلى عنصر معيّن.

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

يوضّح الشكل 1 كيفية استخدام طريقة setInheritFrom() لوراثة الجهات الرئيسية المسموح بها بشكل غير مباشر والجهات الرئيسية المرفوضة بشكل غير مباشر.

رسم الروابط بين العناصر
الشكل 1. الطريقة setInheritFrom()

يتم تمثيل عناصر التحكّم في الوصول هذه في الشكل 1:

  • المستخدم 1 هو مستخدم أساسي مسموح به مباشرةً في الملف A.
  • المستخدم 2 هو كيان أساسي مسموح به بشكل مباشر للملف B.
  • يرث العنصر "ب" قائمة التحكم بالوصول الخاصة بالعنصر "أ".

استنادًا إلى عناصر التحكّم في إمكانية الوصول، تكون قواعد الوصول كما يلي:

  • لا يلزم تحديد المستخدم 1 بشكل صريح كجهة أساسية في العنصر B ليكون جهة أساسية مسموحًا بها بشكل غير مباشر في العنصر B، بل يتم اكتساب إذن الوصول لأنّ المستخدم 1 مُدرَج كجهة أساسية مسموحًا بها بشكل مباشر في العنصر A، ويكتسب العنصر B قائمة التحكّم بالوصول من العنصر A.
  • المستخدم 2 ليس جهة أساسية مسموحًا بها بشكل غير مباشر للعنصر A.

تحديد نوع البيانات الموروثة

إذا ضبطت عملية التوريث باستخدام الطريقة setInheritFrom()، عليك ضبط نوع التوريث باستخدام الطريقة setInheritanceType(). يحدّد نوع الإذن الموروث طريقة دمج قائمة التحكّم بالوصول (ACL) الخاصة بالعنصر الفرعي مع قائمة التحكّم بالوصول الخاصة بالعنصر الرئيسي. تنفِّذ السمة Acl.InheritanceType ثلاثة أنواع من الوراثة:

  • استخدِم BOTH_PERMIT لضبط نوع الإذن على BOTH_PERMIT ومنح المستخدم إذن الوصول إلى العنصر فقط عندما يسمح كل من قائمة التحكّم بالوصول الخاصة بالعنصر الفرعي وقائمة التحكّم بالوصول الخاصة بالعنصر الأصل الموروث للمستخدم بالوصول إلى هذا العنصر.

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

  • PARENT_OVERRIDE: اضبط نوع الإذن الموروث على PARENT_OVERRIDE لفرض أولوية قائمة التحكّم بالوصول الخاصة بالعنصر الأصل على قائمة التحكّم بالوصول الخاصة بالعنصر الفرعي عندما تتعارض القائمتان. لذلك، إذا كانت قائمة التحكّم بالوصول الخاصة بالعنصر الفرعي تمنع المستخدم من الوصول إليه كقارئ مرفوض، سيظل بإمكان المستخدم الوصول إليه إذا كان لديه إذن الوصول إلى العنصر الرئيسي كقارئ. في المقابل، حتى إذا كانت قائمة التحكّم بالوصول الخاصة بالعنصر الفرعي تمنح المستخدم إذن الوصول، لن يتمكّن المستخدم من الوصول إليه إذا كان لديه إذن قراءة مرفوض للعنصر الرئيسي.

عند تقييم سلسلة توريث قائمة التحكّم بالوصول، يمكن أن يؤدي ترتيب التقييم إلى تغيير نتيجة قرار التفويض. توفّر Cloud Search ترتيب تقييم من الأدنى إلى الأعلى لسلاسل وراثة قوائم التحكم بالوصول. على وجه التحديد، يبدأ قرار قائمة التحكّم بالوصول (ACL) لسلسلة بتقييم عنصر فرعي مع العناصر الرئيسية، ويمكن أن يتطوّر إلى أن يصل إلى العنصر الرئيسي الأساسي.

على سبيل المثال، إذا كان الطفل لديه نوع إذن الوصول CHILD_OVERRIDE وكان لدى المستخدم إذن الوصول إلى الطفل، لن يحتاج Drive إلى تقييم الوالد. ومع ذلك، إذا كان لدى الطفل إذن PARENT_OVERRIDE أو BOTH_PERMIT، سيواصل Drive تقييم الإذن الموروث في أعلى سلسلة الإذن.

الحاويات وحذف العناصر

عند فهرسة عنصر، يمكنك تصنيفه كحاوية باستخدام طريقة setContainer() التابعة لفئة IndexingItemBuilder. تحدّد علاقة الحاوية/العنصر التسلسل الهرمي المادي للعناصر وتضمن حذف العناصر بشكل صحيح. عند حذف حاوية، يتم حذف العناصر التي تحتويها أيضًا.

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

يتم تمثيل عناصر التحكّم في الوصول هذه في الشكل 2:

  • المستخدم 1 هو مستخدم أساسي مسموح به مباشرةً في الملف A.
  • المستخدم 2 هو كيان أساسي مسموح به بشكل مباشر للملف B.
  • المستخدم 3 هو مستخدم أساسي مسموح به بشكل مباشر للعنصر C.
  • يرث العنصر C قائمة التحكّم بالوصول الخاصة بالعنصر A.
  • يُدرج العنصر "ب" العنصر "أ" كحاوية له.
  • تحدّد السلعة C اسم السلعة B كحاوية لها.

استنادًا إلى عناصر التحكّم في إمكانية الوصول، تكون قواعد الوصول كما يلي:

  • يأتي الوصول غير المباشر من طريقة setInheritFrom(). وبالتالي، يمكن للمستخدم 1 الوصول إلى العنصر C لأنّ العنصر C يرث قائمة التحكّم بالوصول الخاصة بالعنصر A.
  • لا يأتي الوصول غير المباشر من احتواء العنصر B على العنصر C. وبالتالي، لا يمكن للمستخدم 2 الوصول إلى العنصر C.
رسم الروابط بين العناصر
الشكل 2. تمثّل هذه السمة setInheritFrom() الطريقة المستخدَمة.

يتيح لك فصل اكتساب قائمة التحكّم بالوصول عن التسلسل الهرمي للاحتواء تصميم العديد من البُنى الحالية المختلفة.

عند حذف عنصر بنجاح:

  • أي عنصر كان يتضمّن عنصرًا محذوفًا يصبح غير قابل للبحث ويتم تحديد موعد لحذفه من مصدر بيانات Google.
  • أي عنصر حدّد العنصر المحذوف باستخدام الطريقة setInheritFrom() سيصبح غير قابل للبحث.

إذا كان أحد المراجع يتضمّن عنصرًا محذوفًا باستخدام طريقة setInheritFrom()، ولكنّه لا يتضمّن حاوية تم ضبطها باستخدام setContainer()، أو إذا كان التسلسل الهرمي للاحتواء لا يتضمّن أي عناصر محذوفة، سيبقى هذا العنصر وبياناته في مصدر بيانات Google. أنت المسؤول عن حذف العنصر.

يوضّح الشكل 3 مثالاً على كيفية عمل عملية الحذف في التسلسل الهرمي للعناصر.

رسم الروابط بين العناصر
الشكل 3. حذف عنصر ووراثة قائمة التحكّم بالوصول

يتم تمثيل عناصر التحكّم في الوصول هذه في الشكل 3:

  • المستخدم 1 هو مستخدم أساسي مسموح به مباشرةً في العنصر A.
  • المستخدم 2 هو كيان أساسي مسموح به بشكل مباشر للعنصر D.
  • يرث العنصر D والعنصر E قائمة التحكّم بالوصول الخاصة بالعنصر A.
  • تسمّي السلعة D السلعة A كحاويتها.
  • العنصران A وE هما عنصران على مستوى الجذر لأنّهما لا يحتويان على عنصر حاوٍ.

يتم حذف العناصر بشكل متسلسل من خلال مراجع الحاوية. عند حذف العنصر "أ":

  • يفقد جميع العناصر الفرعية من مرجع setInheritFrom() إذن الوصول لجميع المستخدمين.
  • لا يمكن لأي مستخدم الوصول إلى العنصر (أ).
  • يتم حذف العنصر D ضمنيًا. لا يمكن لأي مستخدم الوصول إلى العنصر D.
  • لا يتم حذف العنصر E، لأنّ الحذف يتم فقط من خلال مراجع الحاويات.
  • يتعذّر الوصول إلى العنصر E ولا يمكن لأي مستخدم البحث عنه.