> For the complete documentation index, see [llms.txt](https://overleaf-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://overleaf-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>Пример LDAP для Server Pro</p></figcaption></figure>

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

Внутри Overleaf LDAP использует [passport-ldapauth](https://github.com/vesse/passport-ldapauth) библиотеку. Большинство этих параметров конфигурации передаются в `сервер` объект config, который используется для настройки `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, мы не храним (и не удаляем существующие) хэшированные пароли в базе данных MongoDB 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`
  * Область поиска может быть `базовой`, `один уровень`, или `поддеревом` (по умолчанию).
* `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`
  * Указывает базовый DN, с которого начинается поиск контактов. По умолчанию `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * Область поиска может быть `базовой`, `один уровень`, или `поддеревом` (по умолчанию).
* `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="Наш экземпляр Overleaf"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

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

# Отключает требование подтверждения электронной почты
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://overleaf-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.
