2013年4月16日火曜日

AD認証の Java プログラム

AD認証のJavaプログラムを書く機会があったので、紹介。


import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.AuthenticationException;
import javax.naming.directory.InitialDirContext;

/**
 * JNDI の LDAP インタフェースを用いて AD認証を実行
 *
 * 引数1:AD 接続先 URL
 * 引数2:AD のドメイン名
 * 引数3:ユーザID
 * 引数4:パスワード
 */
public class adauth {

    public static void main(String args[]) {

        Hashtable env = new Hashtable();

        // Contextファクトリ
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

        // 接続先URL
        env.put(Context.PROVIDER_URL,args[0]);

        // セキュリティレベル
        env.put(Context.SECURITY_AUTHENTICATION, "simple");

        // ユーザID+ドメイン
        env.put(Context.SECURITY_PRINCIPAL, args[2] + "@" + args[1]);

        // パスワード
        env.put(Context.SECURITY_CREDENTIALS, args[3]);

try {
// 認証チェック
InitialDirContext context = new InitialDirContext(env);
System.out.println("OK");
} catch (AuthenticationException ex) {
// 認証エラー
String msg = ex.getExplanation();
if ( msg.indexOf("AcceptSecurityContext") > 0 &&
msg.substring(msg.indexOf("AcceptSecurityContext")).indexOf("775") > 0 ) {
System.out.println("ユーザがロックアウト");
} else {
System.out.println("認証エラー");
}
} catch (NamingException ex ) {
// その他通信エラー等
ex.printStackTrace();
}
    }
}


以下のコマンドで実験できます。


java adauth ldap://XXX.XXX.XXX.XXX:389/ mypcad.com myuserid "mypassword"

一応、AD認証のエラー判定として、通常の認証エラーと、パスワード間違えすぎてロックアウトされているエラーは区別したいのですが、どうがんばってもエラーメッセージからしか判定できないような気がします。こんな実装で良いんかな?誰か良い方法があれば教えてください。





0 コメント:

コメントを投稿