记一次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域 免证书
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)