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

# Xác thực LDAP

<Info>
  Tính năng này được phát triển bởi [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Dưới đây chúng tôi cung cấp một số tài liệu để bạn tham khảo khi cấu hình.
</Info>

<Warning>
  Overleaf sử dụng thư viện **passport-ldapauth**, vốn đã khá lỗi thời, nên khả năng tương thích LDAP không thể được đảm bảo hoàn toàn. Với một số nhà cung cấp danh tính LDAP (ví dụ: [https://goauthentik.io/](https://goauthentik.io/)), có thể xảy ra lỗi đăng nhập. Vì vậy, nếu có thể, bạn nên ưu tiên sử dụng phương thức OAuth/SAML. Với goauthentik, hãy làm theo phần [Hướng dẫn từng bước: goauthentik](/vi/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication#hướng-dẫn-từng-bước-goauthentik) bên dưới, đã được kiểm thử.
</Warning>

### LDAP là gì

LDAP là một giao thức xác thực được dùng để xác minh danh tính từ bên ngoài. Overleaf Server Pro cung cấp một biểu mẫu đăng nhập LDAP riêng trong giao diện web, tách biệt với phương thức xác thực tiêu chuẩn. Khi người dùng gửi tên đăng nhập và mật khẩu LDAP, backend của Overleaf sẽ xác minh thông tin đăng nhập với máy chủ LDAP đã được cấu hình, ví dụ `ldap://ldap:10389`.

<Frame caption="Ví dụ về LDAP trên 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>

### Cấu hình

Bên trong, LDAP của Overleaf sử dụng thư viện [passport-ldapauth](https://github.com/vesse/passport-ldapauth). Hầu hết các tùy chọn cấu hình này được truyền vào đối tượng cấu hình `server` dùng để cấu hình `passport-ldapauth`. Nếu bạn gặp vấn đề khi cấu hình LDAP, bạn nên đọc README của `passport-ldapauth` để hiểu cấu hình mà thư viện này mong đợi.

Biến môi trường `EXTERNAL_AUTH` là bắt buộc để bật module xác thực LDAP. Biến môi trường này chỉ định những phương thức xác thực bên ngoài nào được kích hoạt. Giá trị của biến là một danh sách. Nếu danh sách có chứa `ldap` thì xác thực LDAP sẽ được kích hoạt.

Ví dụ: `EXTERNAL_AUTH=ldap saml`

Khác với Overleaf CEP, trong phiên bản ayaka-notes của chúng tôi, xác thực LDAP được giới hạn là một phương thức xác thực thuần túy, có tại `http://your-overleaf.com/ldap/login`.

Khi sử dụng phương thức xác thực LDAP, người dùng nhập `username` và `password` vào biểu mẫu đăng nhập, hệ thống sẽ thực hiện:

1. Tìm kiếm người dùng LDAP trong thư mục LDAP bằng bộ lọc được định nghĩa bởi `OVERLEAF_LDAP_SEARCH_FILTER` và xác thực.
2. Nếu xác thực thành công, cơ sở dữ liệu người dùng Overleaf sẽ được kiểm tra để tìm người dùng có địa chỉ email chính khớp với địa chỉ email của người dùng LDAP đã xác thực:
   * Nếu tìm thấy người dùng khớp, trường `hashedPassword` của người dùng này sẽ bị xóa (nếu có). Điều này đảm bảo rằng sau này người dùng chỉ có thể đăng nhập qua xác thực LDAP.
   * Nếu không tìm thấy người dùng khớp, một người dùng Overleaf mới sẽ được tạo bằng email, tên và họ được lấy từ máy chủ LDAP.

<Danger>
  Đối với người dùng đăng nhập qua LDAP, chúng tôi không lưu (hoặc sẽ xóa nếu đã tồn tại) mật khẩu đã băm trong cơ sở dữ liệu mongo của Overleaf.
</Danger>

#### Biến môi trường

* `OVERLEAF_LDAP_URL` <strong>(bắt buộc)</strong>
  * URL của máy chủ LDAP.
    * Ví dụ: `ldaps://ldap.example.com:636` (LDAP qua SSL)
    * Ví dụ: `ldap://ldap.example.com:389` (không mã hóa hoặc STARTTLS, nếu được cấu hình).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Tên hiển thị của dịch vụ danh tính LDAP, được dùng trên trang đăng nhập.
  * Mặc định là `Log in with LDAP Provider`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * Thuộc tính email được máy chủ LDAP trả về, mặc định là `mail`. Mỗi người dùng LDAP phải có ít nhất một địa chỉ email. Nếu có nhiều địa chỉ, chỉ địa chỉ đầu tiên được sử dụng.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * Tên thuộc tính chứa tên (first name) của người dùng được dùng trong ứng dụng, thường là `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * Tên thuộc tính chứa họ (family name) của người dùng được dùng trong ứng dụng, thường là `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * Tên thuộc tính chứa họ tên đầy đủ của người dùng, thường là `cn`. Nếu một trong hai biến trước không được định nghĩa, tên và/hoặc họ của người dùng sẽ được trích xuất từ biến này. Ngược lại, biến này sẽ không được sử dụng.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * Placeholder cho biểu mẫu đăng nhập, mặc định là `Username`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Nếu đặt là `true`, các trường `first_name` và `last_name` của người dùng LDAP sẽ được cập nhật khi đăng nhập, đồng thời tắt biểu mẫu thông tin người dùng trên trang `/user/settings` đối với người dùng LDAP. Nếu không, thông tin chỉ được lấy trong lần đăng nhập đầu tiên.
* `OVERLEAF_LDAP_BIND_DN`
  * Distinguished name của người dùng LDAP được dùng cho kết nối LDAP (người dùng này phải có khả năng tìm kiếm/liệt kê tài khoản trên máy chủ LDAP), ví dụ `cn=ldap_reader,dc=example,dc=com`. Nếu không được định nghĩa, binding ẩn danh sẽ được sử dụng.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Mật khẩu cho `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Thuộc tính của người dùng dùng để bind với client, mặc định là `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` <strong>(bắt buộc)</strong>
  * Base DN để bắt đầu tìm kiếm người dùng. Ví dụ: `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * Bộ lọc tìm kiếm LDAP dùng để tìm người dùng. Sử dụng chuỗi '\{\{username}}' để tên đăng nhập được cung cấp được chèn vào phép tìm kiếm LDAP.
    * Ví dụ: `(|(uid={{username}})(mail={{username}}))` (người dùng có thể đăng nhập bằng email hoặc tên đăng nhập).
    * Ví dụ: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * Phạm vi tìm kiếm có thể là `base`, `one` hoặc `sub` (mặc định).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * Mảng JSON các thuộc tính cần lấy từ máy chủ LDAP, ví dụ `["uid", "mail", "givenName", "sn"]`. Theo mặc định, tất cả thuộc tính đều được lấy.
* `OVERLEAF_LDAP_STARTTLS`
  * Nếu là `true`, LDAP qua TLS sẽ được sử dụng.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * Đường dẫn đến tệp chứa chứng chỉ CA dùng để xác minh chứng chỉ SSL/TLS của máy chủ LDAP. Nếu có nhiều chứng chỉ, giá trị có thể là một mảng JSON các đường dẫn đến chứng chỉ. Docker container phải truy cập được các tệp này.
    * Ví dụ (một chứng chỉ): `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * Ví dụ (nhiều chứng chỉ): `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * Nếu là `true`, chứng chỉ của máy chủ sẽ được xác minh dựa trên danh sách các CA được cung cấp.
* `OVERLEAF_LDAP_CACHE`
  * Nếu là `true`, tối đa 100 thông tin đăng nhập cùng lúc sẽ được lưu vào bộ nhớ đệm trong 5 phút.
* `OVERLEAF_LDAP_TIMEOUT`
  * Thời gian client cho phép các thao tác tồn tại trước khi hết thời gian chờ, tính bằng ms (Mặc định: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * Thời gian client chờ trước khi hết thời gian chờ đối với kết nối TCP, tính bằng ms (Mặc định: giá trị mặc định của hệ điều hành).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` và `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * Khi cả hai biến môi trường được đặt, quá trình đăng nhập sẽ cập nhật `user.isAdmin = true` nếu hồ sơ LDAP chứa thuộc tính được chỉ định bởi `OVERLEAF_LDAP_IS_ADMIN_ATT` và giá trị của nó khớp với `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` hoặc là một mảng chứa `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`; ngược lại, `user.isAdmin` được đặt là `false`. Nếu một trong hai biến không được đặt, trạng thái quản trị viên chỉ được đặt là `true` khi tạo người dùng quản trị trong Launchpad.

Năm biến sau được dùng để cấu hình cách lấy danh bạ người dùng từ máy chủ LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * Bộ lọc dùng để tìm kiếm người dùng trên máy chủ LDAP để nạp vào danh bạ. Placeholder '\{\{userProperty}}' trong bộ lọc sẽ được thay bằng giá trị của thuộc tính được chỉ định bởi `OVERLEAF_LDAP_CONTACTS_PROPERTY` của người dùng LDAP khởi tạo tìm kiếm. Nếu không được định nghĩa, sẽ không có người dùng nào được lấy từ máy chủ LDAP vào danh bạ.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * Chỉ định base DN để bắt đầu tìm kiếm danh bạ. Mặc định là `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * Phạm vi tìm kiếm có thể là `base`, `one` hoặc `sub` (mặc định).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * Chỉ định thuộc tính của đối tượng người dùng sẽ thay thế placeholder '\{\{userProperty}}' trong `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * Chỉ định giá trị của `OVERLEAF_LDAP_CONTACTS_PROPERTY` nếu việc tìm kiếm được khởi tạo bởi người dùng không phải LDAP. Nếu biến này không được định nghĩa, bộ lọc kết quả sẽ không khớp với gì cả. Giá trị `*` có thể được dùng làm ký tự đại diện.

<Accordion title="Ví dụ">
  ```text theme={null}
  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
  ```

  Ví dụ trên sẽ nạp vào danh bạ của người dùng LDAP hiện tại tất cả người dùng LDAP có cùng UNIX `gid`. Người dùng không phải LDAP sẽ có tất cả người dùng LDAP có UNIX `gid=1000` trong danh bạ của họ.
</Accordion>

<Accordion title="Tệp variables.env mẫu">
  ```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>

## Hướng dẫn từng bước: goauthentik

Phần này hướng dẫn một cấu hình đã được kiểm thử với [goauthentik](https://goauthentik.io/). Các ví dụ sử dụng Base DN `dc=example,dc=com`; hãy thay bằng Base DN của bạn.

<Steps>
  <Step title="Tạo tài khoản bind">
    Overleaf trước tiên đăng nhập vào thư mục bằng một tài khoản riêng để tìm người dùng. Trong Authentik, mở **Directory > Users**, nhấp **New User**, chọn **Internal User** và nhấp **Next**. Nhập tên người dùng, ví dụ `ldapservice`, rồi nhấp **Create**:

    <Frame caption="Authentik: tạo tài khoản 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>

    Mở người dùng mới và nhấp **Set password**. Mật khẩu này được đặt vào `OVERLEAF_LDAP_BIND_CREDENTIALS`:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: đặt mật khẩu cho tài khoản bind (phiên bản thử nghiệm)">
        <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>

    Ghi lại số của người dùng trên thanh địa chỉ, ví dụ `19` trong `…/#/identity/users/19`. Bạn sẽ cần số này ở bước 3.
  </Step>

  <Step title="Tạo provider và application">
    Mở **Applications > Applications** và nhấp **New Application**. Trình hướng dẫn sẽ tạo application cùng với provider của nó.

    1\. Đặt tên và slug cho application, ví dụ `overleaf-ldap`, rồi nhấp **Next**:

    <Frame caption="Authentik: tên và slug của application">
      <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\. Chọn **LDAP Provider** và nhấp **Next**:

    <Frame caption="Authentik: chọn provider 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\. Đặt **Bind Mode** thành **Direct binding** và **Search Mode** thành **Direct querying**:

    <Frame caption="Authentik: chế độ bind và tìm kiếm của provider 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\. Ở phía dưới, đặt **Bind Flow** thành `default-authentication-flow` và **Base DN** thành Base DN của bạn, ví dụ `dc=example,dc=com`:

    <Frame caption="Authentik: bind flow và Base DN của provider 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\. Nhấp **Next** cho đến trang cuối cùng và gửi application.
  </Step>

  <Step title="Cho phép tài khoản bind tìm kiếm trong thư mục">
    Nếu không có quyền này, tài khoản bind chỉ nhìn thấy chính nó, việc tìm kiếm không tìm thấy người dùng nào và mọi lần đăng nhập LDAP đều thất bại.

    Mở provider, chuyển đến **Permissions** và nhấp **Assign Role Object Permission**. Ở mục **Role**, nhập số từ bước 1 và chọn `ak-managed-role--user-<number>`, sau đó bật **Search full LDAP directory**:

    <Frame caption="Authentik: cấp quyền tìm kiếm cho tài khoản bind (phiên bản thử nghiệm)">
      <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>

    Sau đó, role sẽ hiển thị dấu tích ở cột **Search full LDAP directory**:

    <Frame caption="Authentik: quyền của một provider LDAP (phiên bản thử nghiệm)">
      <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="Chạy LDAP outpost">
    Authentik trả lời các yêu cầu LDAP thông qua một outpost, là một container riêng. Mở **Applications > Outposts**, tạo một outpost loại **LDAP** với provider của bạn và triển khai nó theo mô tả của Authentik. Outpost lắng nghe trên cổng 389 của máy chủ mà nó chạy trên đó. Khi đã kết nối, nó hiển thị dấu tích màu xanh lá:

    <Frame caption="Authentik: một LDAP outpost đang chạy (phiên bản thử nghiệm)">
      <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="Điền các DN">
    Trang provider hiển thị Base DN và một ví dụ trong **How to connect**:

    <Frame caption="Authentik: tổng quan của một provider LDAP (phiên bản thử nghiệm)">
      <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>

    Đừng sao chép nguyên các giá trị ví dụ:

    * **Bind DN** hiển thị tài khoản bạn đang đăng nhập. Thay vào đó, hãy dùng tài khoản bind từ bước 1: `cn=ldapservice,ou=users,<Base DN>`.
    * **Search base** hiển thị Base DN. Hãy dùng `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 giữ một nhóm mang tên của mỗi người dùng trong `ou=virtual-groups`. Tìm kiếm `(cn=alice)` trên toàn bộ Base DN sẽ tìm thấy cả `cn=alice,ou=users,…` và `cn=alice,ou=virtual-groups,…`, và Overleaf từ chối lần đăng nhập khớp với nhiều hơn một mục. Hãy giữ search base là `ou=users,<Base DN>`.
    </Warning>
  </Step>

  <Step title="Kiểm tra việc tìm kiếm">
    Trước khi khởi động Overleaf, hãy chạy thao tác tìm kiếm mà Overleaf sẽ thực hiện. Kết quả phải in ra đúng một `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
    ```

    Nếu không có `dn:` nào, thường là do thiếu quyền ở bước 3.
  </Step>

  <Step title="Ánh xạ quản trị viên (tùy chọn)">
    Các nhóm của người dùng nằm trong `memberOf`, dưới dạng các DN thuộc `ou=groups`. Để các thành viên của nhóm Authentik `Admins` trở thành quản trị viên 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>
      Cờ quản trị viên được cập nhật ở mỗi lần đăng nhập LDAP. Nếu thuộc tính hoặc giá trị sai, mọi quản trị viên đăng nhập qua LDAP sẽ mất quyền quản trị. Hãy thử nghiệm việc ánh xạ bằng một tài khoản quản trị viên thứ hai trước.
    </Warning>
  </Step>
</Steps>

<Accordion title="Tệp variables.env đã kiểm thử cho 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.