> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

<Warning>
  Overleaf использует библиотеку **passport-ldapauth**, которая довольно устарела, поэтому совместимость с LDAP не может быть полностью гарантирована. С некоторыми поставщиками удостоверений LDAP (например, [https://goauthentik.io/](https://goauthentik.io/)) возможны сбои при входе. Поэтому по возможности рекомендуется в первую очередь использовать OAuth/SAML. Для goauthentik следуйте разделу [Пошаговая инструкция: goauthentik](/ru/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication) ниже, который проверен на практике.
</Warning>

### Что такое LDAP

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

<Frame caption="Пример LDAP в Server Pro">
  <img src="https://mintcdn.com/ayakaleaf-pro/x9kfDjtWlyyhG_mR/images/on-premises/image-29.png?fit=max&auto=format&n=x9kfDjtWlyyhG_mR&q=85&s=f3ebcacecec45115cf9b1fa55eb1ba94" alt="" width="2804" height="2005" data-path="images/on-premises/image-29.png" />
</Frame>

### Настройка

Внутри Overleaf LDAP использует библиотеку [passport-ldapauth](https://github.com/vesse/passport-ldapauth). Большинство параметров конфигурации передаются в объект конфигурации `server`, который используется для настройки `passport-ldapauth`. Если у вас возникают проблемы с настройкой LDAP, стоит прочитать README `passport-ldapauth`, чтобы понять, какую конфигурацию она ожидает.

Для включения модуля аутентификации LDAP требуется переменная окружения `EXTERNAL_AUTH`. Эта переменная определяет, какие внешние методы аутентификации включены. Её значение — список. Если список содержит `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-сервера.

<Danger>
  Для пользователей, входящих через LDAP, мы не храним хеши паролей в базе данных mongo Overleaf (а существующие удаляем).
</Danger>

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

* `OVERLEAF_LDAP_URL` <strong>(обязательно)</strong>
  * 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`
  * Текст-заполнитель для формы входа, по умолчанию `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`. Если не задано, используется анонимная привязка.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Пароль для `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Свойство пользователя, используемое для привязки к клиенту, по умолчанию `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` <strong>(обязательно)</strong>
  * Базовый 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`
  * Базовый 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. Если эта переменная не задана, итоговый фильтр не найдёт ничего. В качестве подстановочного знака можно использовать значение `*`.

<Accordion title="Пример">
  ```text theme={null}
  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`.
</Accordion>

<Accordion title="Пример файла variables.env">
  ```text theme={null}
  OVERLEAF_APP_NAME="Our Overleaf Instance"

  ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

  # Enables Thumbnail generation using ImageMagick
  ENABLE_CONVERSIONS=true

  # Disables email confirmation requirement
  EMAIL_CONFIRMATION_DISABLED=true

  ## Nginx
  # NGINX_WORKER_PROCESSES=4
  # NGINX_WORKER_CONNECTIONS=768

  ## Set for TLS via nginx-proxy
  # OVERLEAF_BEHIND_PROXY=true
  # OVERLEAF_SECURE_COOKIE=true

  OVERLEAF_SITE_URL=http://my-overleaf-instance.com
  OVERLEAF_NAV_TITLE=Our Overleaf Instance
  # OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
  OVERLEAF_ADMIN_EMAIL=support@example.com

  OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
  OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "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=This system is run by department x

  OVERLEAF_PROXY_LEARN=true
  NAV_HIDE_POWERED_BY=true

  #################
  ## LDAP for 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='Username or email address'

  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='*'
  ```
</Accordion>

## Пошаговая инструкция: goauthentik

Здесь описана настройка, проверенная с [goauthentik](https://goauthentik.io/). В примерах используется Base DN `dc=example,dc=com`; замените его на свой.

<Steps>
  <Step title="Создайте учётную запись для bind">
    Сначала Overleaf входит в каталог под собственной учётной записью, чтобы найти пользователя. В Authentik откройте **Directory > Users**, нажмите **New User**, выберите **Internal User** и нажмите **Next**. Введите имя пользователя, например `ldapservice`, и нажмите **Create**:

    <Frame caption="Authentik: создание учётной записи для bind">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-create.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=bf5d9a5aefd048781339157121a9e203" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-user-create.png" />
    </Frame>

    Откройте нового пользователя и нажмите **Set password**. Этот пароль указывается в `OVERLEAF_LDAP_BIND_CREDENTIALS`:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: установка пароля учётной записи для bind (тестовый экземпляр)">
        <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-page.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=96aad0f919dc8e74fef5995b1dde1e78" alt="" width="207" data-path="images/on-premises/ldap-authentik-user-page.png" />
      </Frame>
    </div>

    Запомните номер пользователя в адресной строке, например `19` в `…/#/identity/users/19`. Он понадобится на шаге 3.
  </Step>

  <Step title="Создайте провайдер и приложение">
    Откройте **Applications > Applications** и нажмите **New Application**. Мастер создаёт приложение и его провайдер одновременно.

    1\. Задайте приложению имя и slug, например `overleaf-ldap`, и нажмите **Next**:

    <Frame caption="Authentik: имя и slug приложения">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-app.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=0d3e6b54e9bf552bd81d8b1d6b722701" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-app.png" />
    </Frame>

    2\. Выберите **LDAP Provider** и нажмите **Next**:

    <Frame caption="Authentik: выбор провайдера LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-type.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ee63f2682051572a08c1f5bc321a1af6" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-type.png" />
    </Frame>

    3\. Установите **Bind Mode** в **Direct binding**, а **Search Mode** в **Direct querying**:

    <Frame caption="Authentik: режимы bind и поиска провайдера LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-modes.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ea147f1605e76142021d07f775d5ef53" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-modes.png" />
    </Frame>

    4\. Ниже установите **Bind Flow** в `default-authentication-flow`, а **Base DN** — в ваш Base DN, например `dc=example,dc=com`:

    <Frame caption="Authentik: bind flow и Base DN провайдера LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-basedn.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=4ce418571d83294ee749d56b13c63d44" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-basedn.png" />
    </Frame>

    5\. Нажимайте **Next** до последней страницы и отправьте приложение.
  </Step>

  <Step title="Разрешите учётной записи для bind искать в каталоге">
    Без этого разрешения учётная запись для bind видит только саму себя, поиск не находит ни одного пользователя, и любой вход через LDAP завершается ошибкой.

    Откройте провайдер, перейдите в **Permissions** и нажмите **Assign Role Object Permission**. В поле **Role** введите номер из шага 1 и выберите `ak-managed-role--user-<number>`, затем включите **Search full LDAP directory**:

    <Frame caption="Authentik: выдача учётной записи для bind разрешения на поиск (тестовый экземпляр)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-assign.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=5af53c691ae845adcb4ede42c24fb600" alt="" width="1120" height="529" data-path="images/on-premises/ldap-authentik-assign.png" />
    </Frame>

    После этого у роли появится галочка в столбце **Search full LDAP directory**:

    <Frame caption="Authentik: разрешения провайдера LDAP (тестовый экземпляр)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-permissions.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=24ae7f0dfb6d19e1b3d6584d6ccf0f0b" alt="" width="990" height="488" data-path="images/on-premises/ldap-authentik-permissions.png" />
    </Frame>
  </Step>

  <Step title="Запустите LDAP outpost">
    Authentik отвечает на запросы LDAP через outpost — отдельный контейнер. Откройте **Applications > Outposts**, создайте outpost типа **LDAP** с вашим провайдером и разверните его, как описано в документации Authentik. Он слушает порт 389 на хосте, где запущен. Когда он подключён, отображается зелёная галочка:

    <Frame caption="Authentik: работающий LDAP outpost (тестовый экземпляр)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-outposts.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=cd8af2f7df7b2df24d2369416509faef" alt="" width="990" height="468" data-path="images/on-premises/ldap-authentik-outposts.png" />
    </Frame>

    ```dotenv theme={null}
    OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
    ```
  </Step>

  <Step title="Заполните DN">
    На странице провайдера показаны Base DN и пример в разделе **How to connect**:

    <Frame caption="Authentik: обзор провайдера LDAP (тестовый экземпляр)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-provider.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=9aa4b747f4c0f51533454a97d835c18c" alt="" width="990" height="773" data-path="images/on-premises/ldap-authentik-provider.png" />
    </Frame>

    Не копируйте значения из примера как есть:

    * **Bind DN** показывает учётную запись, под которой вы вошли. Вместо неё используйте учётную запись для bind из шага 1: `cn=ldapservice,ou=users,<Base DN>`.
    * **Search base** показывает Base DN. Используйте `ou=users,<Base DN>`.

    ```dotenv theme={null}
    OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
    OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
    OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
    OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
    ```

    <Warning>
      Authentik хранит в `ou=virtual-groups` группу с именем каждого пользователя. Поиск `(cn=alice)` по всему Base DN находит и `cn=alice,ou=users,…`, и `cn=alice,ou=virtual-groups,…`, а Overleaf отклоняет вход, если найдено больше одной записи. Оставьте базу поиска равной `ou=users,<Base DN>`.
    </Warning>
  </Step>

  <Step title="Проверьте поиск">
    Перед запуском Overleaf выполните тот же поиск, который будет выполнять он. Команда должна вывести ровно одну строку `dn:`:

    ```shell theme={null}
    ldapsearch -x -H ldap://ldap.example.com:389 \
      -D cn=ldapservice,ou=users,dc=example,dc=com -w '<password of ldapservice>' \
      -b ou=users,dc=example,dc=com '(cn=alice)' dn
    ```

    Если `dn:` нет вовсе, обычно это значит, что отсутствует разрешение из шага 3.
  </Step>

  <Step title="Назначьте администраторов (необязательно)">
    Группы пользователя находятся в `memberOf` в виде DN в `ou=groups`. Чтобы члены группы Authentik `Admins` стали администраторами Overleaf:

    ```dotenv theme={null}
    OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
    OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
    ```

    <Warning>
      Флаг администратора обновляется при каждом входе через LDAP. При неверном атрибуте или значении каждый администратор, вошедший через LDAP, теряет права администратора. Сначала проверьте сопоставление на второй учётной записи администратора.
    </Warning>
  </Step>
</Steps>

<Accordion title="Проверенный variables.env для goauthentik">
  ```dotenv title="variables.env" wrap theme={null}
  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_IDENTITY_SERVICE_NAME=Log in with Authentik
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
  OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_NAME_ATT=name
  OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
  ```
</Accordion>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.