Skip to main content
طُوّرت هذه الميزة من قِبل yu-i-i/overleaf-cep. ونقدّم هنا بعض الوثائق لمساعدتك في الإعداد.
يستخدم Overleaf مكتبة passport-ldapauth، وهي قديمة نسبيًا، لذا لا يمكن ضمان التوافق الكامل مع LDAP. ومع بعض مزوّدي هوية LDAP (على سبيل المثال، https://goauthentik.io/)، قد تحدث حالات فشل في تسجيل الدخول. لذلك، يُنصح إن أمكن باستخدام طريقة OAuth/SAML أولًا. بالنسبة إلى goauthentik، اتبع دليل خطوة بخطوة: goauthentik أدناه، فقد تم اختباره.

ما هو LDAP

LDAP هو بروتوكول مصادقة يُستخدم للتحقق من الهوية خارجيًا. يوفّر Overleaf Server Pro نموذج تسجيل دخول مخصصًا لـ LDAP في واجهة الويب، منفصلًا عن طريقة المصادقة القياسية. عندما يُدخل المستخدم اسم المستخدم وكلمة المرور الخاصين به في LDAP، تتحقق الواجهة الخلفية لـ Overleaf من بيانات الاعتماد مقابل خادم LDAP المُعدّ، على سبيل المثال ldap://ldap:10389.

مثال على LDAP في Server Pro

الإعداد

داخليًا، يستخدم LDAP في Overleaf مكتبة passport-ldapauth. وتُمرَّر معظم خيارات الإعداد هذه إلى كائن الإعداد server الذي يُستخدم لإعداد passport-ldapauth. إذا واجهت مشكلات في إعداد LDAP، فمن المفيد قراءة ملف README الخاص بـ passport-ldapauth لفهم الإعدادات التي يتوقعها. متغير البيئة EXTERNAL_AUTH مطلوب لتفعيل وحدة المصادقة عبر LDAP. يحدد متغير البيئة هذا طرق المصادقة الخارجية المفعّلة. وقيمة هذا المتغير عبارة عن قائمة. إذا تضمنت القائمة ldap فسيتم تفعيل المصادقة عبر LDAP. على سبيل المثال: EXTERNAL_AUTH=ldap saml على خلاف Overleaf CEP، فإننا في إصدار ayaka-notes نقصر المصادقة عبر LDAP على كونها طريقة مصادقة بحتة، وهي متاحة على http://your-overleaf.com/ldap/login. عند استخدام طرق المصادقة عبر LDAP، يُدخل المستخدم username و password في نموذج تسجيل الدخول، وتتم المحاولة كما يلي:
  1. يتم البحث عن مستخدم LDAP في دليل LDAP باستخدام المرشّح المحدد في OVERLEAF_LDAP_SEARCH_FILTER ثم تتم مصادقته.
  2. إذا نجحت المصادقة، يتم فحص قاعدة بيانات مستخدمي Overleaf بحثًا عن مستخدم يطابق عنوان بريده الإلكتروني الأساسي عنوانَ البريد الإلكتروني لمستخدم LDAP الذي تمت مصادقته:
    • إذا عُثر على مستخدم مطابق، يُحذف الحقل hashedPassword لهذا المستخدم (إن وُجد). ويضمن ذلك أن المستخدم لن يتمكن مستقبلًا من تسجيل الدخول إلا عبر المصادقة بـ LDAP.
    • إذا لم يُعثر على مستخدم مطابق، يتم إنشاء مستخدم Overleaf جديد باستخدام البريد الإلكتروني والاسم الأول واسم العائلة المسترجعة من خادم LDAP.
بالنسبة للمستخدمين الذين يسجّلون الدخول عبر LDAP، لا نخزّن كلمات المرور المجزّأة (hashed) في قاعدة بيانات mongo الخاصة بـ Overleaf (ونحذف الموجود منها).

متغيرات البيئة

  • OVERLEAF_LDAP_URL (مطلوب)
    • عنوان URL لخادم LDAP.
      • مثال: ldaps://ldap.example.com:636 (LDAP عبر SSL)
      • مثال: ldap://ldap.example.com:389 (غير مشفّر أو STARTTLS، إذا تم إعداده).
  • OVERLEAF_LDAP_IDENTITY_SERVICE_NAME
    • الاسم المعروض لخدمة هوية LDAP، ويُستخدم في صفحة تسجيل الدخول.
    • القيمة الافتراضية Log in with LDAP Provider.
  • OVERLEAF_LDAP_EMAIL_ATT
    • سمة البريد الإلكتروني التي يُرجعها خادم LDAP، والقيمة الافتراضية mail. يجب أن يكون لكل مستخدم LDAP عنوان بريد إلكتروني واحد على الأقل. وإذا تم توفير عدة عناوين، فسيُستخدم الأول فقط.
  • OVERLEAF_LDAP_FIRST_NAME_ATT
    • اسم الخاصية التي تحتوي على الاسم الأول للمستخدم والذي يُستخدم في التطبيق، وعادةً ما تكون givenName.
  • OVERLEAF_LDAP_LAST_NAME_ATT
    • اسم الخاصية التي تحتوي على اسم عائلة المستخدم والذي يُستخدم في التطبيق، وعادةً ما تكون sn.
  • OVERLEAF_LDAP_NAME_ATT
    • اسم الخاصية التي تحتوي على الاسم الكامل للمستخدم، وعادةً ما تكون cn. إذا لم يتم تعريف أيٍّ من المتغيرين السابقين، يُستخرج الاسم الأول و/أو اسم العائلة للمستخدم من هذا المتغير. وإلا فلا يُستخدم.
  • OVERLEAF_LDAP_PLACEHOLDER
    • النص النائب (placeholder) لنموذج تسجيل الدخول، والقيمة الافتراضية Username.
  • OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN
    • إذا عُيّن إلى true، فسيتم تحديث الحقلين first_name و last_name لمستخدم LDAP عند تسجيل الدخول، وإيقاف نموذج تفاصيل المستخدم في الصفحة /user/settings لمستخدمي LDAP. وإلا فسيتم جلب التفاصيل عند تسجيل الدخول الأول فقط.
  • OVERLEAF_LDAP_BIND_DN
    • الاسم المميّز (DN) لمستخدم LDAP الذي يجب استخدامه لاتصال LDAP (يجب أن يكون هذا المستخدم قادرًا على البحث في الحسابات وسردها على خادم LDAP)، مثل cn=ldap_reader,dc=example,dc=com. إذا لم يتم تعريفه، فسيُستخدم الربط المجهول (anonymous binding).
  • OVERLEAF_LDAP_BIND_CREDENTIALS
    • كلمة المرور الخاصة بـ OVERLEAF_LDAP_BIND_DN.
  • OVERLEAF_LDAP_BIND_PROPERTY
    • خاصية المستخدم التي يتم الربط بها مقابل العميل، والقيمة الافتراضية dn.
  • OVERLEAF_LDAP_SEARCH_BASE (مطلوب)
    • الاسم المميّز الأساسي (base DN) الذي يبدأ منه البحث عن المستخدمين. مثل ou=people,dc=example,dc=com.
  • OVERLEAF_LDAP_SEARCH_FILTER
    • مرشّح بحث LDAP الذي يُستخدم للعثور على المستخدم. استخدم النص الحرفي ‘{{username}}’ لإدراج اسم المستخدم المُدخل في بحث LDAP.
      • مثال: (|(uid={{username}})(mail={{username}})) (يمكن للمستخدم تسجيل الدخول بالبريد الإلكتروني أو باسم تسجيل الدخول).
      • مثال: (sAMAccountName={{username}}) (Active Directory).
  • OVERLEAF_LDAP_SEARCH_SCOPE
    • يمكن أن يكون نطاق البحث base أو one أو sub (الافتراضي).
  • OVERLEAF_LDAP_SEARCH_ATTRIBUTES
    • مصفوفة JSON من السمات المراد جلبها من خادم LDAP، مثل ["uid", "mail", "givenName", "sn"]. افتراضيًا، يتم جلب جميع السمات.
  • OVERLEAF_LDAP_STARTTLS
    • إذا كانت القيمة true، فسيُستخدم LDAP عبر TLS.
  • OVERLEAF_LDAP_TLS_OPTS_CA_PATH
    • مسار الملف الذي يحتوي على شهادة CA المستخدمة للتحقق من شهادة SSL/TLS لخادم LDAP. وإذا كانت هناك عدة شهادات، فيمكن أن يكون مصفوفة JSON من مسارات الشهادات. يجب أن تكون الملفات قابلة للوصول من حاوية docker.
      • مثال (شهادة واحدة): /var/lib/overleaf/certs/ldap_ca_cert.pem
      • مثال (عدة شهادات): ["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]
  • OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH
    • إذا كانت القيمة true، فسيتم التحقق من شهادة الخادم مقابل قائمة جهات CA المزوّدة.
  • OVERLEAF_LDAP_CACHE
    • إذا كانت القيمة true، فسيتم تخزين ما يصل إلى 100 من بيانات الاعتماد في الذاكرة المؤقتة لمدة 5 دقائق.
  • OVERLEAF_LDAP_TIMEOUT
    • المدة التي يسمح فيها العميل باستمرار العمليات قبل انتهاء المهلة، بالمللي ثانية (الافتراضي: Infinity).
  • OVERLEAF_LDAP_CONNECT_TIMEOUT
    • المدة التي ينتظرها العميل قبل انتهاء مهلة اتصالات TCP، بالمللي ثانية (الافتراضي: القيمة الافتراضية لنظام التشغيل).
  • OVERLEAF_LDAP_IS_ADMIN_ATT و OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE
    • عند تعيين كلا متغيري البيئة، تقوم عملية تسجيل الدخول بتحديث user.isAdmin = true إذا كان ملف تعريف LDAP يحتوي على السمة المحددة في OVERLEAF_LDAP_IS_ADMIN_ATT وكانت قيمتها إما مطابقة لـ OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE أو مصفوفة تحتوي على OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE، وإلا فيتم تعيين user.isAdmin إلى false. وإذا لم يتم تعيين أيٍّ من هذين المتغيرين، فلن تُعيَّن حالة المسؤول إلى true إلا أثناء إنشاء المستخدم المسؤول في Launchpad.
تُستخدم المتغيرات الخمسة التالية لإعداد كيفية استرجاع جهات اتصال المستخدم من خادم LDAP.
  • OVERLEAF_LDAP_CONTACTS_FILTER
    • المرشّح المستخدم للبحث عن المستخدمين في خادم LDAP لتحميلهم في جهات الاتصال. يُستبدل النص النائب ‘{{userProperty}}’ داخل المرشّح بقيمة الخاصية المحددة في OVERLEAF_LDAP_CONTACTS_PROPERTY لمستخدم LDAP الذي بدأ البحث. وإذا لم يتم تعريفه، فلن يُسترجع أي مستخدم من خادم LDAP إلى جهات الاتصال.
  • OVERLEAF_LDAP_CONTACTS_SEARCH_BASE
    • يحدد الاسم المميّز الأساسي (base DN) الذي يبدأ منه البحث عن جهات الاتصال. والقيمة الافتراضية هي OVERLEAF_LDAP_SEARCH_BASE.
  • OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE
    • يمكن أن يكون نطاق البحث base أو one أو sub (الافتراضي).
  • OVERLEAF_LDAP_CONTACTS_PROPERTY
    • يحدد خاصية كائن المستخدم التي ستحل محل النص النائب ‘{{userProperty}}’ في OVERLEAF_LDAP_CONTACTS_FILTER.
  • OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE
    • يحدد قيمة OVERLEAF_LDAP_CONTACTS_PROPERTY إذا بدأ البحث مستخدمٌ من غير مستخدمي LDAP. وإذا لم يتم تعريف هذا المتغير، فلن يطابق المرشّح الناتج أي شيء. ويمكن استخدام القيمة * كحرف بدل (wildcard).
يؤدي المثال أعلاه إلى تحميل جميع مستخدمي LDAP الذين لديهم نفس قيمة UNIX gid في جهات اتصال مستخدم LDAP الحالي. أما المستخدمون من غير مستخدمي LDAP فستحتوي جهات اتصالهم على جميع مستخدمي LDAP الذين لديهم UNIX gid=1000.

دليل خطوة بخطوة: goauthentik

يشرح هذا الدليل إعدادًا تم اختباره مع goauthentik. تستخدم الأمثلة Base DN dc=example,dc=com؛ استبدله بالقيمة الخاصة بك.
1

أنشئ حساب الربط (bind)

يسجّل Overleaf الدخول أولًا إلى الدليل بحساب خاص به للعثور على المستخدم. في Authentik، افتح Directory > Users، وانقر على New User، واختر Internal User ثم انقر على Next. أدخل اسم مستخدم، على سبيل المثال ldapservice، ثم انقر على Create:

Authentik: إنشاء حساب الربط

افتح المستخدم الجديد وانقر على Set password. توضع كلمة المرور هذه في OVERLEAF_LDAP_BIND_CREDENTIALS:

Authentik: تعيين كلمة مرور حساب الربط (نسخة اختبارية)

دوّن رقم المستخدم الظاهر في شريط العنوان، على سبيل المثال 19 في …/#/identity/users/19. ستحتاج إليه في الخطوة 3.
2

أنشئ المزوّد والتطبيق

افتح Applications > Applications وانقر على New Application. ينشئ المعالج التطبيق والمزوّد الخاص به معًا.1. امنح التطبيق اسمًا وslug، على سبيل المثال overleaf-ldap، ثم انقر على Next:

Authentik: اسم التطبيق وslug الخاص به

2. اختر LDAP Provider ثم انقر على Next:

Authentik: اختيار مزوّد LDAP

3. اضبط Bind Mode على Direct binding وSearch Mode على Direct querying:

Authentik: وضع الربط ووضع البحث لمزوّد LDAP

4. في الأسفل، اضبط Bind Flow على default-authentication-flow وBase DN على Base DN الخاص بك، على سبيل المثال dc=example,dc=com:

Authentik: تدفق الربط وBase DN لمزوّد LDAP

5. انقر على Next حتى الصفحة الأخيرة ثم أرسل التطبيق.
3

اسمح لحساب الربط بالبحث في الدليل

بدون هذه الصلاحية لا يرى حساب الربط إلا نفسه، فلا يعثر البحث على أي مستخدم ويفشل كل تسجيل دخول عبر LDAP.افتح المزوّد، وانتقل إلى Permissions وانقر على Assign Role Object Permission. في حقل Role، اكتب الرقم من الخطوة 1 واختر ak-managed-role--user-<number>، ثم فعّل Search full LDAP directory:

Authentik: منح حساب الربط صلاحية البحث (نسخة اختبارية)

بعد ذلك يظهر للدور علامة صح تحت Search full LDAP directory:

Authentik: صلاحيات مزوّد LDAP (نسخة اختبارية)

4

شغّل LDAP outpost

يجيب Authentik على طلبات LDAP عبر outpost، وهو حاوية منفصلة. افتح Applications > Outposts، وأنشئ outpost من النوع LDAP مع المزوّد الخاص بك، ثم انشره كما يوضح Authentik. يستمع على المنفذ 389 للمضيف الذي يعمل عليه. عند اتصاله، تظهر علامة صح خضراء:

Authentik: LDAP outpost قيد التشغيل (نسخة اختبارية)

5

املأ قيم DN

تعرض صفحة المزوّد Base DN ومثالًا ضمن How to connect:

Authentik: نظرة عامة على مزوّد LDAP (نسخة اختبارية)

لا تنسخ القيم النموذجية كما هي:
  • يعرض Bind DN الحساب الذي سجّلت الدخول به. استخدم بدلًا منه حساب الربط من الخطوة 1: cn=ldapservice,ou=users,<Base DN>.
  • يعرض Search base قيمة Base DN. استخدم ou=users,<Base DN>.
يحتفظ Authentik بمجموعة تحمل اسم كل مستخدم تحت ou=virtual-groups. البحث في كامل Base DN عن (cn=alice) يعثر على cn=alice,ou=users,… وcn=alice,ou=virtual-groups,… معًا، ويرفض Overleaf أي تسجيل دخول يطابق أكثر من إدخال واحد. أبقِ قاعدة البحث على ou=users,<Base DN>.
6

تحقّق من البحث

قبل تشغيل Overleaf، نفّذ البحث نفسه الذي سيجريه. يجب أن يطبع dn: واحدًا بالضبط:
إذا لم يظهر أي dn: على الإطلاق، فهذا يعني عادةً أن الصلاحية من الخطوة 3 مفقودة.
7

ربط المسؤولين (اختياري)

توجد مجموعات المستخدم في memberOf على شكل قيم DN تحت ou=groups. لجعل أعضاء مجموعة Authentik Admins مسؤولين في Overleaf:
يتم تحديث علامة المسؤول عند كل تسجيل دخول عبر LDAP. إذا كانت السمة أو القيمة خاطئة، فسيفقد كل مسؤول يسجّل الدخول عبر LDAP صلاحيات المسؤول. اختبر الربط أولًا بحساب مسؤول ثانٍ.
variables.env
آخر تعديل في ٦ أكتوبر ٢٠٢٦