Skip to content

LDAP

필수 의존성: io.ktor:ktor-server-auth, io.ktor:ktor-server-auth-ldap

코드 예시: auth-ldap

네이티브 서버
Ktor는 Kotlin/Native를 지원하며 추가 런타임이나 가상 머신 없이 서버를 실행할 수 있게 해줍니다.
지원: ✖️

LDAP는 사용자 정보를 저장할 수 있는 다양한 디렉터리 서비스와 연동하기 위한 프로토콜입니다. Ktor를 사용하면 basic, digest, 또는 폼 기반(form-based) 인증 스킴을 사용하여 LDAP 사용자를 인증할 수 있습니다.

Ktor의 인증 및 권한 부여에 대한 일반적인 정보는 Ktor 서버의 인증 및 권한 부여 섹션에서 확인할 수 있습니다.

의존성 추가

LDAP 인증을 활성화하려면 빌드 스크립트에 ktor-server-authktor-server-auth-ldap 아티팩트를 포함해야 합니다.

Kotlin
Groovy
XML

LDAP 구성

1단계: 인증 프로바이더 선택

LDAP 사용자를 인증하려면 먼저 사용자 이름과 비밀번호 유효성 검사를 위한 인증 프로바이더를 선택해야 합니다. Ktor에서는 이를 위해 basic, digest, 또는 폼 기반(form-based) 프로바이더를 사용할 수 있습니다. 예를 들어, basic 인증 프로바이더를 사용하려면 install 블록 내에서 basic 함수를 호출합니다.

kotlin
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.auth.ldap.*
//...
install(Authentication) {
    basic {
        validate { credentials ->
            // Authenticate an LDAP user
        }
    }
}

validate 함수는 사용자 자격 증명을 확인하는 데 사용됩니다.

2단계: LDAP 사용자 인증

LDAP 사용자를 인증하려면 ldapAuthenticate 함수를 호출해야 합니다. 이 함수는 UserPasswordCredential을 허용하고 지정된 LDAP 서버에 대해 유효성을 검사합니다.

kotlin
install(Authentication) {
    basic("auth-ldap") {
        validate { credentials ->
            ldapAuthenticate(credentials, "ldap://0.0.0.0:389", "cn=%s,dc=ktor,dc=io")
        }
    }
}

validate 함수는 인증 성공 시 UserIdPrincipal을 반환하고, 인증 실패 시 null을 반환합니다.

선택적으로, 인증된 사용자에 대한 추가 유효성 검사를 추가할 수 있습니다.

kotlin
install(Authentication) {
    basic("auth-ldap") {
        validate { credentials ->
            ldapAuthenticate(credentials, "ldap://localhost:389", "cn=%s,dc=ktor,dc=io") {
                if (it.name == it.password) {
                    UserIdPrincipal(it.name)
                } else {
                    null
                }
            }
        }
    }
}

3단계: 특정 리소스 보호

LDAP를 구성한 후, authenticate 함수를 사용하여 애플리케이션의 특정 리소스를 보호할 수 있습니다. 인증에 성공하면 라우트 핸들러 내에서 call.principal 함수를 사용하여 인증된 UserIdPrincipal을 검색하고 인증된 사용자의 이름을 가져올 수 있습니다.

kotlin
routing {
    authenticate("auth-ldap") {
        get("/") {
            call.respondText("Hello, ${call.principal<UserIdPrincipal>()?.name}!")
        }
    }
}

완전한 실행 가능한 예시는 다음에서 찾을 수 있습니다: auth-ldap.

현재 LDAP 구현은 동기(synchronous) 방식임을 명심하십시오.