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

# LDAP 인증

<Info>
  이 기능은 [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep)에서 개발되었습니다. 여기서는 구성에 필요한 몇 가지 문서를 제공합니다.
</Info>

<Warning>
  Overleaf는 비교적 오래된 **passport-ldapauth** 라이브러리를 사용하므로 LDAP 호환성을 완전히 보장할 수 없습니다. 일부 LDAP ID 제공자(예: [https://goauthentik.io/](https://goauthentik.io/))에서는 로그인 실패가 발생할 수 있습니다. 따라서 가능하다면 OAuth/SAML 방식을 우선 사용하는 것을 권장합니다. goauthentik의 경우 아래의 테스트를 거친 [단계별 안내: goauthentik](/ko/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication)을 따르세요.
</Warning>

### LDAP란?

LDAP는 외부 신원 확인에 사용되는 인증 프로토콜입니다. Overleaf Server Pro는 웹 인터페이스에서 표준 인증 방식과는 별도로 전용 LDAP 로그인 양식을 제공합니다. 사용자가 LDAP 사용자 이름과 비밀번호를 제출하면 Overleaf 백엔드는 구성된 LDAP 서버(예: `ldap://ldap:10389`)를 통해 자격 증명을 검증합니다.

<Frame caption="Server Pro의 LDAP 예시">
  <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>

### 구성

Overleaf LDAP는 내부적으로 [passport-ldapauth](https://github.com/vesse/passport-ldapauth) 라이브러리를 사용합니다. 대부분의 구성 옵션은 `passport-ldapauth`를 구성하는 데 사용되는 `server` 구성 객체로 전달됩니다. LDAP 구성에 문제가 있다면 `passport-ldapauth`의 README를 읽고 어떤 구성을 기대하는지 파악해 보는 것이 좋습니다.

LDAP 인증 모듈을 활성화하려면 `EXTERNAL_AUTH` 환경 변수가 필요합니다. 이 환경 변수는 활성화할 외부 인증 방식을 지정하며, 값은 목록 형식입니다. 목록에 `ldap`이 포함되어 있으면 LDAP 인증이 활성화됩니다.

예: `EXTERNAL_AUTH=ldap saml`

Overleaf CEP와 달리 ayaka-notes 에디션에서는 LDAP 인증을 순수한 인증 방식으로만 제한하며, `http://your-overleaf.com/ldap/login`에서 사용할 수 있습니다.

LDAP 인증 방식을 사용할 때 사용자가 로그인 양식에 `username`과 `password`를 입력하면 다음이 시도됩니다.

1. `OVERLEAF_LDAP_SEARCH_FILTER`로 정의된 필터를 사용해 LDAP 디렉터리에서 LDAP 사용자를 검색하고 인증합니다.
2. 인증에 성공하면 Overleaf 사용자 데이터베이스에서 인증된 LDAP 사용자의 이메일 주소와 일치하는 기본 이메일 주소를 가진 사용자를 확인합니다.
   * 일치하는 사용자가 있으면 해당 사용자의 `hashedPassword` 필드를 삭제합니다(있는 경우). 이렇게 하면 이후 해당 사용자는 LDAP 인증으로만 로그인할 수 있습니다.
   * 일치하는 사용자가 없으면 LDAP 서버에서 가져온 이메일, 이름, 성을 사용해 새 Overleaf 사용자를 생성합니다.

<Danger>
  LDAP로 로그인하는 사용자의 경우 Overleaf mongo 데이터베이스에 해시된 비밀번호를 저장하지 않으며, 기존 비밀번호가 있으면 제거합니다.
</Danger>

#### 환경 변수

* `OVERLEAF_LDAP_URL` <strong>(필수)</strong>
  * LDAP 서버의 URL입니다.
    * 예: `ldaps://ldap.example.com:636` (LDAP over SSL)
    * 예: `ldap://ldap.example.com:389` (암호화되지 않음 또는 구성된 경우 STARTTLS)
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * 로그인 페이지에 표시되는 LDAP ID 서비스의 이름입니다.
  * 기본값은 `Log in with LDAP Provider`입니다.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * LDAP 서버가 반환하는 이메일 속성으로, 기본값은 `mail`입니다. 각 LDAP 사용자는 최소 하나의 이메일 주소를 가져야 합니다. 여러 주소가 제공되면 첫 번째 주소만 사용됩니다.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * 애플리케이션에서 사용하는 사용자의 이름(first name)을 담은 속성 이름으로, 보통 `givenName`입니다.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * 애플리케이션에서 사용하는 사용자의 성(family name)을 담은 속성 이름으로, 보통 `sn`입니다.
* `OVERLEAF_LDAP_NAME_ATT`
  * 사용자의 전체 이름을 담은 속성 이름으로, 보통 `cn`입니다. 앞의 두 변수 중 하나라도 정의되지 않은 경우 이 변수에서 사용자의 이름 및/또는 성을 추출합니다. 그렇지 않으면 사용되지 않습니다.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * 로그인 양식의 자리 표시자로, 기본값은 `Username`입니다.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * `true`로 설정하면 로그인 시 LDAP 사용자의 `first_name` 및 `last_name` 필드를 업데이트하고, LDAP 사용자의 `/user/settings` 페이지에서 사용자 정보 양식을 비활성화합니다. 그렇지 않으면 첫 로그인 시에만 정보를 가져옵니다.
* `OVERLEAF_LDAP_BIND_DN`
  * LDAP 연결에 사용할 LDAP 사용자의 고유 이름(DN)입니다(이 사용자는 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` <strong>(필수)</strong>
  * 사용자를 검색할 기준 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`이면 LDAP over TLS를 사용합니다.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * LDAP 서버의 SSL/TLS 인증서를 검증하는 데 사용하는 CA 인증서 파일의 경로입니다. 인증서가 여러 개인 경우 인증서 경로의 JSON 배열을 사용할 수 있습니다. 파일은 Docker 컨테이너에서 접근할 수 있어야 합니다.
    * 예(인증서 1개): `/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`
  * 클라이언트가 작업을 시간 초과 처리하기 전까지 유지하는 시간(ms)입니다(기본값: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * 클라이언트가 TCP 연결을 시간 초과 처리하기 전까지 기다리는 시간(ms)입니다(기본값: OS 기본값).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` 및 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * 두 환경 변수가 모두 설정된 경우, LDAP 프로필에 `OVERLEAF_LDAP_IS_ADMIN_ATT`로 지정된 속성이 있고 그 값이 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`와 일치하거나 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`를 포함하는 배열이면 로그인 과정에서 `user.isAdmin = true`로 업데이트하고, 그렇지 않으면 `user.isAdmin`을 `false`로 설정합니다. 두 변수 중 하나라도 설정되지 않으면 관리자 상태는 Launchpad에서 관리자 사용자를 생성할 때만 `true`로 설정됩니다.

다음 다섯 개의 변수는 LDAP 서버에서 사용자 연락처를 가져오는 방식을 구성하는 데 사용됩니다.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * 연락처로 불러올 사용자를 LDAP 서버에서 검색할 때 사용하는 필터입니다. 필터 안의 자리 표시자 '\{\{userProperty}}'는 검색을 시작한 LDAP 사용자의 `OVERLEAF_LDAP_CONTACTS_PROPERTY`로 지정된 속성 값으로 대체됩니다. 정의하지 않으면 LDAP 서버에서 연락처로 가져오는 사용자가 없습니다.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * 연락처 검색을 시작할 기준 DN을 지정합니다. 기본값은 `OVERLEAF_LDAP_SEARCH_BASE`입니다.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * 검색 범위로 `base`, `one`, `sub`(기본값) 중 하나를 지정할 수 있습니다.
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * `OVERLEAF_LDAP_CONTACTS_FILTER`의 '\{\{userProperty}}' 자리 표시자를 대체할 사용자 객체의 속성을 지정합니다.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * LDAP가 아닌 사용자가 검색을 시작한 경우 사용할 `OVERLEAF_LDAP_CONTACTS_PROPERTY`의 값을 지정합니다. 이 변수를 정의하지 않으면 결과 필터는 아무것도 일치시키지 않습니다. 값 `*`를 와일드카드로 사용할 수 있습니다.

<Accordion title="예시">
  ```text theme={null}
  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 사용자가 표시됩니다.
</Accordion>

<Accordion title="variables.env 파일 샘플">
  ```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>

## 단계별 안내: goauthentik

여기서는 [goauthentik](https://goauthentik.io/)에서 테스트를 거친 설정 과정을 단계별로 안내합니다. 예시에서는 Base DN으로 `dc=example,dc=com`을 사용하므로 사용 중인 값으로 바꾸세요.

<Steps>
  <Step title="바인드 계정 만들기">
    Overleaf는 사용자를 찾기 위해 먼저 자체 계정으로 디렉터리에 로그인합니다. Authentik에서 **Directory > Users**를 열고 **New User**를 클릭한 다음 **Internal User**를 선택하고 **Next**를 클릭합니다. 사용자 이름(예: `ldapservice`)을 입력하고 **Create**를 클릭합니다:

    <Frame caption="Authentik: 바인드 계정 만들기">
      <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>

    새 사용자를 열고 **Set password**를 클릭합니다. 이 비밀번호는 `OVERLEAF_LDAP_BIND_CREDENTIALS`에 들어갑니다:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: 바인드 계정의 비밀번호 설정(테스트 인스턴스)">
        <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>

    주소 표시줄에서 사용자 번호를 기록해 두세요. 예를 들어 `…/#/identity/users/19`에서는 `19`입니다. 이 번호는 3단계에서 필요합니다.
  </Step>

  <Step title="제공자와 애플리케이션 만들기">
    **Applications > Applications**를 열고 **New Application**을 클릭합니다. 마법사가 애플리케이션과 해당 제공자를 함께 만듭니다.

    1\. 애플리케이션에 이름과 슬러그(예: `overleaf-ldap`)를 지정하고 **Next**를 클릭합니다:

    <Frame caption="Authentik: 애플리케이션의 이름과 슬러그">
      <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\. **LDAP Provider**를 선택하고 **Next**를 클릭합니다:

    <Frame caption="Authentik: 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\. **Bind Mode**를 **Direct binding**으로, **Search Mode**를 **Direct querying**으로 설정합니다:

    <Frame caption="Authentik: 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\. 그 아래에서 **Bind Flow**를 `default-authentication-flow`로, **Base DN**을 사용 중인 Base DN(예: `dc=example,dc=com`)으로 설정합니다:

    <Frame caption="Authentik: LDAP 제공자의 바인드 플로우와 Base DN">
      <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\. 마지막 페이지까지 **Next**를 클릭한 다음 애플리케이션을 제출합니다.
  </Step>

  <Step title="바인드 계정이 디렉터리를 검색할 수 있도록 허용하기">
    이 권한이 없으면 바인드 계정은 자기 자신만 볼 수 있으므로 검색에서 사용자를 찾지 못하고 모든 LDAP 로그인이 실패합니다.

    제공자를 열고 **Permissions**로 이동한 다음 **Assign Role Object Permission**을 클릭합니다. **Role**에 1단계에서 기록한 번호를 입력하고 `ak-managed-role--user-<number>`를 선택한 다음 **Search full LDAP directory**를 켭니다:

    <Frame caption="Authentik: 바인드 계정에 검색 권한 부여(테스트 인스턴스)">
      <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>

    그러면 해당 역할의 **Search full LDAP directory** 아래에 체크 표시가 나타납니다:

    <Frame caption="Authentik: LDAP 제공자의 권한(테스트 인스턴스)">
      <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="LDAP 아웃포스트 실행하기">
    Authentik은 별도의 컨테이너인 아웃포스트를 통해 LDAP 요청에 응답합니다. **Applications > Outposts**를 열고 사용 중인 제공자로 **LDAP** 유형의 아웃포스트를 만든 다음 Authentik 안내에 따라 배포합니다. 아웃포스트는 실행 중인 호스트의 389번 포트에서 수신 대기합니다. 연결되면 녹색 체크 표시가 나타납니다:

    <Frame caption="Authentik: 실행 중인 LDAP 아웃포스트(테스트 인스턴스)">
      <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="DN 입력하기">
    제공자 페이지의 **How to connect** 아래에 Base DN과 예시가 표시됩니다:

    <Frame caption="Authentik: LDAP 제공자 개요(테스트 인스턴스)">
      <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>

    예시 값을 그대로 복사하지 마세요:

    * **Bind DN**에는 현재 로그인한 계정이 표시됩니다. 대신 1단계의 바인드 계정을 사용하세요: `cn=ldapservice,ou=users,<Base DN>`.
    * **Search base**에는 Base DN이 표시됩니다. `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은 `ou=virtual-groups` 아래에 모든 사용자마다 같은 이름의 그룹을 유지합니다. Base DN 전체에서 `(cn=alice)`를 검색하면 `cn=alice,ou=users,…`와 `cn=alice,ou=virtual-groups,…`가 모두 검색되며, Overleaf는 두 개 이상의 항목과 일치하는 로그인을 거부합니다. 검색 기준은 `ou=users,<Base DN>`으로 유지하세요.
    </Warning>
  </Step>

  <Step title="검색 확인하기">
    Overleaf를 시작하기 전에 Overleaf가 수행할 검색을 직접 실행해 보세요. 정확히 하나의 `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
    ```

    `dn:`이 전혀 출력되지 않는다면 대개 3단계의 권한이 누락된 것입니다.
  </Step>

  <Step title="관리자 매핑하기(선택 사항)">
    사용자의 그룹은 `memberOf`에 `ou=groups` 아래의 DN으로 들어 있습니다. Authentik 그룹 `Admins`의 구성원을 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>
      관리자 플래그는 LDAP 로그인 때마다 업데이트됩니다. 속성이나 값이 잘못되면 LDAP으로 로그인하는 모든 관리자가 관리자 권한을 잃게 됩니다. 먼저 두 번째 관리자 계정으로 매핑을 테스트하세요.
    </Warning>
  </Step>
</Steps>

<Accordion title="goauthentik용으로 테스트된 variables.env">
  ```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.