Skip to main content
Tính năng này được phát triển bởi 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.
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/), 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 bên dưới, đã được kiểm thử.

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.

Ví dụ về LDAP trên Server Pro

Cấu hình

Bên trong, LDAP của Overleaf sử dụng thư viện 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.
Đố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.

Biến môi trường

  • OVERLEAF_LDAP_URL (bắt buộc)
    • 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 (bắt buộc)
    • 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.
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ọ.

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. Các ví dụ sử dụng Base DN dc=example,dc=com; hãy thay bằng Base DN của bạn.
1

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:

Authentik: tạo tài khoản bind

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:

Authentik: đặt mật khẩu cho tài khoản bind (phiên bản thử nghiệm)

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

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:

Authentik: tên và slug của application

2. Chọn LDAP Provider và nhấp Next:

Authentik: chọn provider LDAP

3. Đặt Bind Mode thành Direct binding và Search Mode thành Direct querying:

Authentik: chế độ bind và tìm kiếm của provider LDAP

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:

Authentik: bind flow và Base DN của provider LDAP

5. Nhấp Next cho đến trang cuối cùng và gửi application.
3

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:

Authentik: cấp quyền tìm kiếm cho tài khoản bind (phiên bản thử nghiệm)

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

Authentik: quyền của một provider LDAP (phiên bản thử nghiệm)

4

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á:

Authentik: một LDAP outpost đang chạy (phiên bản thử nghiệm)

5

Điền các DN

Trang provider hiển thị Base DN và một ví dụ trong How to connect:

Authentik: tổng quan của một provider LDAP (phiên bản thử nghiệm)

Đừ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>.
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>.
6

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::
Nếu không có dn: nào, thường là do thiếu quyền ở bước 3.
7

Á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:
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.
variables.env
Lần sửa đổi cuối 6 tháng 10, 2026