Java LDAP統一身份認證

不多說直接看代碼,如下:

import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

/**
 * 用戶登陸認證,LDAP跨域認證,通過LDAP對用戶進行更新
 * 
 */
public class LdapCheck {
    private static LdapContext ctx = null;
    private static Control[] connCtls = null;

    /**** 定義LDAP的基本連接信息 ******/
    // LDAP的連接地址(ldap://ip:port/)port默認爲389
    private static String URL = "?";
    // LDAP的根DN
    private static String BASEDN = "dc=?,dc=?,dc=?";
    // LDAP的連接賬號(身份認證管理平臺添加的應用賬號,應用賬號格式:uid=?,ou=?,dc=????)
    private static String PRINCIPAL = "uid=?,ou=?,dc=?,dc=?,dc=?";
    // LDAP的連接賬號的密碼(身份認證管理平臺添加的應用賬號的密碼)
    private static String PASSWORD = "?";

    public static void main(String[] args) {
        // 登錄用戶的用戶名和密碼
        String username = "?";
        String password = "?";
        System.out.println(authenticate(username, password));
        closeCtx();
    }

    // 校驗用戶名密碼的方法
    public static boolean authenticate(String usr, String pwd) {
        boolean valide = false;
        if (pwd == null || pwd == "")
            return false;
        if (ctx == null) {
            getCtx();
        }
        String userDN = getUserDN(usr);
        if ("".equals(userDN) || userDN == null) {
            return false;
        }
        try {
            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, pwd);
            ctx.reconnect(connCtls);
            valide = true;
        } catch (AuthenticationException e) {
            System.out.println(userDN + " is not authenticated");
            System.out.println(e.toString());
            valide = false;
        } catch (NamingException e) {
            System.out.println(userDN + " is not authenticated");
            valide = false;
        }
        return valide;
    }

    public static void getCtx() {
        if (ctx != null) {
            return;
        }
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, URL + BASEDN);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, PRINCIPAL);
        env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
        try {
            // 鏈接ldap
            ctx = new InitialLdapContext(env, connCtls);
        } catch (javax.naming.AuthenticationException e) {
            System.out.println("Authentication faild: " + e.toString());
        } catch (Exception e) {
            System.out.println("Something wrong while authenticating: " + e.toString());
        }
    }

    public static void closeCtx() {
        try {
            if (ctx != null)
                ctx.close();
        } catch (NamingException ex) {

        }
    }

    public static String getUserDN(String uid) {
        String userDN = "";
        try {
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration<?> en = ctx.search("", "uid=" + uid, constraints);
            if (en == null) {
                System.out.println("Have no NamingEnumeration.");
            }
            if (!en.hasMoreElements()) {
                System.out.println("Have no element.");
            }
            while (en != null && en.hasMoreElements()) {
                Object obj = en.nextElement();
                if (obj instanceof SearchResult) {
                    SearchResult si = (SearchResult) obj;
                    userDN += si.getName();
                    userDN += "," + BASEDN;
                } else {
                    System.out.println(obj);
                }
                System.out.println();
            }
        } catch (Exception e) {
            System.out.println("Exception in search():" + e);
        }

        return userDN;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章