> 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/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 時遇到問題，值得閱讀其 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 驗證登入。
   * 如果沒有找到相符的使用者，系統會使用從 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`, `單層`執行，或 `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`, `單層`執行，或 `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` 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='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='*'
```

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