> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/on-premises/ru/konfiguraciya/overleaf-toolkit/authentication/ldap-authentication.md).

# Аутентификация LDAP

Эта функция разработана [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Здесь мы предлагаем несколько документов для вашей настройки.

{% hint style="warning" %}
Overleaf использует **passport-ldapauth** библиотеку, которая относительно устарела, поэтому совместимость с LDAP не может быть полностью гарантирована. С некоторыми LDAP-поставщиками удостоверений (например, <https://goauthentik.io/>), могут возникать сбои входа. Поэтому, если возможно, рекомендуется сначала использовать метод OAuth/SAML.
{% endhint %}

### Что' LDAP

LDAP — это протокол аутентификации, используемый для внешней проверки удостоверений. Overleaf Server Pro предоставляет отдельную форму входа LDAP в веб-интерфейсе, отдельно от стандартного метода аутентификации. Когда пользователь вводит своё LDAP-имя пользователя и пароль, бэкенд Overleaf проверяет учётные данные по настроенному LDAP-серверу, например `ldap://ldap:10389`.

<figure><img src="/files/d187fe3c22034effc5103ffe8e47c5adcaa49c7e" alt=""><figcaption><p>Пример Server Pro для LDAP</p></figcaption></figure>

### Конфигурация

Внутри Overleaf LDAP использует [passport-ldapauth](https://github.com/vesse/passport-ldapauth) библиотеку. Большинство этих параметров конфигурации передаются в `серверный` объект конфигурации, который используется для настройки `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 пользователь вводит `имя пользователя` и `пароль` в форме входа, выполняется попытка:

1. Пользователь LDAP ищется в каталоге LDAP с использованием фильтра, определённого `OVERLEAF_LDAP_SEARCH_FILTER` и аутентифицируется.
2. Если аутентификация успешна, в базе данных пользователей Overleaf выполняется проверка на наличие пользователя с основным адресом электронной почты, совпадающим с адресом электронной почты аутентифицированного пользователя LDAP:
   * Если найден соответствующий пользователь, `hashedPassword` поле для этого пользователя удаляется (если оно существует). Это гарантирует, что в будущем пользователь сможет входить только через аутентификацию LDAP.
   * Если соответствующий пользователь не найден, создаётся новый пользователь Overleaf с использованием email, имени и фамилии, полученных с LDAP-сервера.

{% hint style="danger" %}
Для пользователей, которые входят через LDAP, мы не храним (и не удаляем существующие) хешированные пароли в базе данных Mongo Overleaf.
{% endhint %}

#### Переменные окружения

* `OVERLEAF_LDAP_URL` **(обязательно)**
  * URL LDAP-сервера.
    * Пример: `ldaps://ldap.example.com:636` (LDAP через SSL)
    * Пример: `ldap://ldap.example.com:389` (без шифрования или STARTTLS, если настроено).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Отображаемое имя службы LDAP-идентификации, используется на странице входа.
  * По умолчанию `Войти через LDAP-провайдера`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * Атрибут email, возвращаемый LDAP-сервером, по умолчанию `mail`. У каждого пользователя LDAP должен быть как минимум один адрес электронной почты. Если указано несколько адресов, будет использоваться только первый.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * Имя свойства, содержащего имя пользователя, используемое в приложении, обычно `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * Имя свойства, содержащего фамилию пользователя, используемое в приложении, обычно `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * Имя свойства, содержащее полное имя пользователя, обычно `cn`. Если не определена любая из двух предыдущих переменных, имя и/или фамилия пользователя извлекается из этой переменной. Иначе она не используется.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * Заполнитель для формы входа, по умолчанию `Имя пользователя`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Если установлено в `true`, обновляет LDAP-пользователя `first_name` и `last_name` поле при входе и отключает форму данных пользователя на `/user/settings` странице для пользователей LDAP. В противном случае данные будут получены только при первом входе.
* `OVERLEAF_LDAP_BIND_DN`
  * Отличительное имя пользователя LDAP, которое следует использовать для подключения к LDAP (этот пользователь должен иметь возможность искать/просматривать учётные записи на LDAP-сервере), например `cn=ldap_reader,dc=example,dc=com`. Если не определено, используется анонимная привязка.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Пароль для `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Свойство пользователя, по которому выполняется привязка к клиенту, по умолчанию `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` **(обязательно)**
  * Базовый DN, с которого выполняется поиск пользователей. Например, `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * Фильтр поиска LDAP, по которому находится пользователь. Используйте буквальное значение '{{username}}', чтобы подставить заданное имя пользователя в поиск LDAP.
    * Пример: `(|(uid={{username}})(mail={{username}}))` (пользователь может войти по email или по имени входа).
    * Пример: `(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`, сертификат сервера проверяется по списку предоставленных центров сертификации.
* `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`
  * Указывает базовый 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-пользователем. Если эта переменная не определена, итоговый фильтр не найдёт ничего. Значение `*` может использоваться как подстановочный знак.

<details>

<summary><strong>Пример</strong></summary>

```
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
```

В приведённом выше примере в контакты текущего пользователя LDAP загружаются все пользователи LDAP, у которых тот же UNIX `gid`. У пользователей, не использующих LDAP, в контактах будут все LDAP-пользователи с UNIX `gid=1000` в их контактах.

</details>

<details>

<summary><strong>Пример файла variables.env</strong></summary>

```
OVERLEAF_APP_NAME="Our Overleaf Instance"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Включает генерацию миниатюр с помощью ImageMagick
ENABLE_CONVERSIONS=true

# Отключает требование подтверждения email
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Настройка TLS через nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Наш экземпляр Overleaf
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "Свяжитесь со своей службой поддержки", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Привет, я справа", "url":"https://github.com/yu-i-i/overleaf-cep"}]

OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=Эта система обслуживается отделом x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
## LDAP для CE ##
#################

EXTERNAL_AUTH=ldap
OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
OVERLEAF_LDAP_STARTTLS=true
OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/var/lib/overleaf/certs/ldap_ca_cert.pem
OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
OVERLEAF_LDAP_EMAIL_ATT=mail
OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
OVERLEAF_LDAP_LAST_NAME_ATT=sn
# OVERLEAF_LDAP_NAME_ATT=cn
OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]

OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true

OVERLEAF_LDAP_PLACEHOLDER='Имя пользователя или адрес электронной почты'

OVERLEAF_LDAP_IS_ADMIN_ATT=mail
OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com

OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/on-premises/ru/konfiguraciya/overleaf-toolkit/authentication/ldap-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
