记一次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项目实现AD域身份认证】一般浏览器都有导入证书的界面可以进行操作,但是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"); // 默认密码为changeitLdapContext 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域 免证书

    推荐阅读