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

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

إنشاء قائمة ACL

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

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

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

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

تتطلّب خدمة Google Cloud Search أن يتم ربط المستخدمين والمجموعات بعنوان بريد إلكتروني على Google. عند فهرسة عناصر المستودع، قد لا تتضمّن موصلات المحتوى عناوين البريد الإلكتروني هذه. ومع ذلك، تتيح لك حزمة تطوير البرامج (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.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 ولا يمكن لأي مستخدم البحث عنه.