Skip to content

LDAP

必須の依存関係: io.ktor:ktor-server-auth, io.ktor:ktor-server-auth-ldap

コード例: auth-ldap

ネイティブサーバー
Ktor supports Kotlin/Native and allows you to run a server without an additional runtime or virtual machine.
のサポート: ✖️

LDAPは、ユーザーに関する情報を保存できるさまざまなディレクトリサービスを操作するためのプロトコルです。Ktorでは、ベーシックダイジェスト、またはフォームベースの認証スキームを使用してLDAPユーザーを認証できます。

Ktorにおける認証と認可に関する一般的な情報は、Ktorサーバーにおける認証と認可セクションで確認できます。

依存関係の追加

LDAP認証を有効にするには、ビルドスクリプトにktor-server-authktor-server-auth-ldapアーティファクトを含める必要があります。

Kotlin
Groovy
XML

LDAPの構成

ステップ1:認証プロバイダーの選択

LDAPユーザーを認証するには、まずユーザー名とパスワードを検証するための認証プロバイダーを選択する必要があります。Ktorでは、ベーシックダイジェスト、またはフォームベースのプロバイダーをこれに使用できます。例えば、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)であることに注意してください。