记一次Java项目实现AD域身份认证

记一次Java项目实现AD域身份认证

    • 一、使用ldap实现AD域身份认证
    • 二、使用ldaps实现AD域身份认证
      • 1. java 导入可信任证书
      • 2. java通过ssl连接LDAP服务器

在项目中,由于新做的系统要求必要接入集团的AD域,使用AD域进行身份认证登录系统,经过查阅资料使用了以下几种方式进行认证机制。

一、使用ldap实现AD域身份认证

ldap认证比较简单,使用Java自带API连接ldap服务器进行身份验证的,废话不多说直接上代码。

	/**
	 * 输入用户名和密码手动登陆验证AD账号密码
	 * @param userid 用户标识
	 * @param password  密码
	 * @return true登陆成功 false 登陆失败
	 */
	public boolean validateAd(String userid,String password) {
		// ldap认证
		boolean flag = false;
        LdapContext ctx = null;
        Hashtable env = new Hashtable();
        try{
            // 采用简单模式
        	env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        	// ldap默认端口为389
	        env.put(Context.PROVIDER_URL, "ldap://xxx.xxx.xxx(服务器地址):389");
	        //  被验证的用户。ps:需带上域或者邮箱后缀
	        env.put(Context.SECURITY_PRINCIPAL, "global\\"+userid);
	        //  被验证用户的密码。
	        env.put(Context.SECURITY_CREDENTIALS, password);
	        //  LDAP工厂类
	        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	        //	连接超时设置为3秒
	        env.put(com.sun.jndi.ldap.connect.timeout, 3000);
	        //  初始化上下文
            ctx = new InitialLdapContext(env, null);
            flag = true;
        }catch(Exception exception) { 
        	System.out.println(userid+"用户,身份验证未知异常!");
        	exception.printStackTrace();
        }finally{
            if(null!=ctx){
                try {
                    ctx.close();
                    ctx=null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
		
	}

当登录成功会返回true,证明我们已经从AD域中验证这个用户的真实性,相反则为false,验证失败。

二、使用ldaps实现AD域身份认证

前期使用了ldap实现身份验证作为系统登陆机制,但是由于ldap使用明文简单方式登录不安全,整个集团把ldap接口关闭掉,使得我们必须将其转换为ldaps使用ssl证书验证。

1. java 导入可信任证书

一般浏览器都有导入证书的界面可以进行操作,但是Java本身是没有的界面支持导入证书的,经过多方资料查阅,发现jdk的bin目录下有一个keytool工具可以将证书导入jdk的keystore 的文件来存储。

在jdk的bin目录下打开keytool工具将证书导入Java

keytool -import  -alias ldapserver -file C:\Users\dell\Desktop\中间证书\中间证书.cer -keystore cacerts -storepass changeit

具体怎么使用可以看我另一篇文章,专门介绍keytool工具的使用。java导入可信任证书
ps: keystore库的默认密码为changeit

2. java通过ssl连接LDAP服务器

使用ssl证书需要先设置读取证书库里面的证书,然后再=通过ssl连接方式与AD域进行验证。废话不多说,上代码 哈哈哈

/**
	 * 输入用户名和密码手动登陆验证AD账号密码
	 * @param userid 用户标识
	 * @param password  密码
	 * @return true登陆成功 false 登陆失败
	 */
	public boolean validateAd(String userid,String password) {
		// ldaps认证
		boolean flag = false;
		
		//	设置keystore读取信任证书bin
		String keystore = "C:/Program Files (x86)/Java/bin/cacerts";  // 生成keystore文件的地址
		System.setProperty("javax.net.ssl.trustStore", keystore); 
		System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); // 默认密码为changeit
		
        LdapContext ctx = null;
        Hashtable env = new Hashtable();
        try{
            // 采用简单模式
        	env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        	// ldaps默认端口为369
	        env.put(Context.PROVIDER_URL, "ldaps://xxx.xxx.xxx(服务器地址):369");
	        //  被验证的用户。ps:需带上域或者邮箱后缀
	        env.put(Context.SECURITY_PRINCIPAL, "global\\"+userid);
	        //  被验证用户的密码。
	        env.put(Context.SECURITY_CREDENTIALS, password);
	        //  LDAP工厂类
	        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	        //	连接超时设置为3秒
	        env.put(com.sun.jndi.ldap.connect.timeout, 3000);
	        //	采用ssl方式连接
	        env.put(Context.SECURITY_PROTOCOL, "ssl"); 
	        //  初始化上下文
            ctx = new InitialLdapContext(env, null);
            flag = true;
        }catch(Exception exception) { 
        	System.out.println(userid+"用户,身份验证未知异常!");
        	exception.printStackTrace();
        }finally{
            if(null!=ctx){
                try {
                    ctx.close();
                    ctx=null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
		
	}

其实对于Java来说导入证书的操作是比较麻烦且证书到期时需要更换的,经过多次网上查找从这篇博客中找到一个绕过证书的方法,具体可以查看这篇文章。java操作ad域 免证书

你可能感兴趣的:(java)