LL脳がscalaの勉強を始めたよ 番外編:ScalaでLdap接続

コップ本を一休みしてScalaLdap接続をしてみる

だいぶScalaの雰囲気がつかめてきたので、ヤクの毛刈り的にLdap認証を試してみる。イントラ系のアプリケーションだと認証をLDAP(Active Directory)でやるとか結構あるので…あるので(言い訳)

Ldapサーバでアカウントとパスワードによる認証を行って、結果をBooleanで返すものを参考サイトをもとに書いてみた。ほぼ写経だけども。

// LDAP接続用のJavaパッケージを読み込み                                                                       
import java.util.Hashtable
import javax.naming.Context
import javax.naming.ldap.{LdapName, InitialLdapContext}
// LDAP接続クラスの定義
class Ldap(server:String, base:String) {
    // ldapサーバ情報の接続の整形
    val ldap_url = "ldap://" + server
    // ldap bind用メソッド dn(アカウント)とパスワードを引数にする
    def bind(dn: String, password: String) : Boolean = {
        try {
            // ldap接続情報をハッシュテーブルに格納
            val env = new Hashtable[String, String]()
            env.put(Context.PROVIDER_URL, ldap_url)
            env.put(Context.SECURITY_AUTHENTICATION, "simple")
            env.put(Context.SECURITY_PRINCIPAL, dn + "@" + base)
            env.put(Context.SECURITY_CREDENTIALS, password)
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory")
            // bind接続
            val ctx = Some(new InitialLdapContext(env, null))
            if(ctx.isEmpty) throw new IllegalArgumentException("Authentication Error")
            ctx.get.close
        }
        // なにがしかのエラー(認証失敗含む)が発生したらbind失敗を返す
        catch {
            case e: Exception => println(e)
            return false
        }
        // 認証に成功 
        return true
    }
}

実行手順

// オブジェクトを取得
val l = new Ldap("<LDAPサーバアドレス>", "<ベースDN>")
// 認証を実行
l.bind("<アカウント(ユーザDN)>", "<パスワード>")
あとで悩むだろうからメモ

ScalaのHashTableではなくjava.util.Hashtableを使用しているのはjavax.namingパッケージの各メソッドがjavaのHashtableでないと動作しないため。ちなみにJavaのHashtableにimmutableのものってあるのかしら?たぶん無いよね?

ScalaのHashTableaについて

呼出方法メモ

// immutableなの
import scala.collection.immutable.HashTable
// mutableなの
import scala.collection.mutable.HashTable
いじょー

たまには具体的なものを書きたくなったので脱線してみました。次はコップ本の第5章に進みまっす。

なお参考サイトにはbind以外のサンプルがあるので、詳しい操作を行いたい人はそちらをどうぞー