LL脳がscalaの勉強を始めたよ 番外編:ScalaでLdap接続
コップ本を一休みしてScalaでLdap接続をしてみる
だいぶ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