> 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/zh-cn/pei-zhi/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 在 Web 界面中提供了一个专门的 LDAP 登录表单，独立于标准认证方式。当用户提交其 LDAP 用户名和密码时，Overleaf 后端会根据配置的 LDAP 服务器验证凭据，例如 `ldap://ldap:10389`.

<figure><img src="/files/405018b20a37b1b72283584b4217cd9556c4b056" alt=""><figcaption><p>LDAP 的 Server Pro 示例</p></figcaption></figure>

### 配置

在内部，Overleaf LDAP 使用 [passport-ldapauth](https://github.com/vesse/passport-ldapauth) 库。大多数这些配置选项都会透传给 `服务器` config 对象，该对象用于配置 `passport-ldapauth`。如果您在配置 LDAP 时遇到问题，建议阅读 `passport-ldapauth` 的 README，以了解它所期望的配置。

环境变量 `EXTERNAL_AUTH` 是启用 LDAP 认证模块所必需的。该环境变量指定启用了哪些外部认证方式。该变量的值是一个列表。如果列表中包含 `ldap` ，则会激活 LDAP 认证。

例如： `EXTERNAL_AUTH=ldap saml`

不同于 Overleaf CEP，在我们的 ayaka-notes 版本中，我们将 LDAP 认证限制为纯认证方式，可在 `http://your-overleaf.com/ldap/login`.

使用 LDAP 认证方式时，用户在登录表单中输入 `用户名` 和 `密码` 后，会尝试：

1. 将使用由 `OVERLEAF_LDAP_SEARCH_FILTER` 定义的过滤器在 LDAP 目录中搜索 LDAP 用户并进行认证。
2. 如果认证成功，则会在 Overleaf 用户数据库中检查是否存在主邮箱地址与已认证 LDAP 用户邮箱地址匹配的用户：
   * 如果找到了匹配的用户，则该用户的 `hashedPassword` 字段将被删除（如果存在）。这确保该用户将来只能通过 LDAP 认证登录。
   * 如果未找到匹配的用户，则会使用从 LDAP 服务器检索到的邮箱、名和姓创建一个新的 Overleaf 用户。

{% hint style="danger" %}
对于通过 LDAP 登录的用户，我们不会在 Overleaf mongo 数据库中存储（或移除已有的）哈希密码。
{% endhint %}

#### 环境变量

* `OVERLEAF_LDAP_URL` **（必需）**
  * LDAP 服务器的 URL。
    * 示例： `ldaps://ldap.example.com:636` （通过 SSL 的 LDAP）
    * 示例： `ldap://ldap.example.com:389` （未加密或 STARTTLS，如果已配置）。
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * LDAP 身份服务的显示名称，用于登录页面。
  * 默认为 `使用 LDAP 提供商登录`.
* `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`
  * 登录表单的占位符，默认为 `用户名`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * 如果设置为 `true`，在登录时更新 LDAP 用户的 `first_name` 和 `last_name` 字段，并关闭 LDAP 用户在 `/user/settings` 页面上的用户详情表单。否则，详情只会在首次登录时获取。
* `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}}))` （用户可以使用邮箱或登录名登录）。
    * 示例： `(sAMAccountName={{username}})` （Active Directory）。
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * 搜索范围可以是 `base`, `one`运行你的 Overleaf 实例，或 `sub` （默认）。
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * 要从 LDAP 服务器获取的属性的 JSON 数组，例如， `["uid", "mail", "givenName", "sn"]`。默认情况下，会获取所有属性。
* `OVERLEAF_LDAP_STARTTLS`
  * 如果 `true`，则使用通过 TLS 的 LDAP。
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * 包含用于验证 LDAP 服务器 SSL/TLS 证书的 CA 证书文件路径。如果有多个证书，则可以是证书路径的 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`运行你的 Overleaf 实例，或 `sub` （默认）。
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * 指定用户对象的属性，它将替换 `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 用户的联系人中加载所有具有相同 UNIX `gid`的 LDAP 用户。非 LDAP 用户的联系人中将包含所有 UNIX `gid=1000` 的 LDAP 用户。

</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_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## 通过 nginx-proxy 设置 TLS
# 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": "联系您的支持团队", "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

#################
## CE 的 LDAP ##
#################

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/zh-cn/pei-zhi/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.
