> 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-tw/she-ding/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/5746cb063b0967f5e1c25ec711461e3a3e145c62" 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` 欄位，並關閉 `/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}}))` （使用者可使用電子郵件或登入名稱登入）。
    * 範例： `(sAMAccountName={{username}})` （Active Directory）。
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * 搜尋範圍可以是 `base`, `one`執行，或 `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`
  * 用戶端在逾時前允許作業持續多久，毫秒（預設：無限）。
* `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
```

上述範例會將所有具有相同 UNIX 的 LDAP 使用者載入目前 LDAP 使用者的聯絡人中。 `gid`。非 LDAP 使用者的聯絡人中將包含所有具有 UNIX `gid=1000` 的 LDAP 使用者。

</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

## 透過 nginx-proxy 設定 TLS
# 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

#################
## 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-tw/she-ding/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.
