Java实现LDAP登录
LDAP的全称是Lightweight Directory Access Protocol(轻量级目录访问协议),是一种用于访问和管理分布式目录信息服务的应用协议。LDAP通常用于存储用户、组和其他组织信息,提供对这些信息的快速查询和管理。
LDAP 是基于X.500标准的一个简化版本,使用更简单的网络协议(如 TCP/IP)来实现,定义了客户端如何与目录服务交互,如添加、删除、修改或查询目录信息。
例:
Java原生支持LDAP协议,通过管理员账户adminDn,adminPassword连接LDAP服务器,并搜索用户的DN,验证用户凭据,再检查输入的密码是否正确。使用SSL加密(ldaps://)时,要提前安装证书到jdk的信任目录内
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;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LdapVerify {
public boolean connehct(String username, String password) {
String ip = "";
String port = "";
String timeOut = "";
String adminDn = "";
String adminPassword = "";
String url = String.format("ldaps://%s:%s", ip, port);
// 1. 建立与 LDAP 的连接
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, adminDn);
env.put(Context.SECURITY_CREDENTIALS, adminPassword);
env.put(Context.SECURITY_PROTOCOL, "ssl"); // 启用 LDAPS
env.put("com.sun.jndi.ldap.connect.timeout", "3000");
try {
LdapContext ldapContext = new InitialLdapContext(env, null);
// 2. 查找用户的完整 DN
String searchBase = "OU=All Users,DC=demo,DC=com"; // 搜索起点
String searchFilter = "(sAMAccountName=" + username + ")"; // 根据用户名查找
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> results = ldapContext.search(searchBase, searchFilter, searchControls);
if (results.hasMore()) {
SearchResult result = results.next();
String userDn = result.getNameInNamespace();
log.info("LDAP登录, 找到用户 DN: " + userDn);
// 3. 验证用户密码
Hashtable<String, String> userEnv = new Hashtable<>();
userEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
userEnv.put(Context.PROVIDER_URL, url);
userEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
userEnv.put(Context.SECURITY_PRINCIPAL, userDn);
userEnv.put(Context.SECURITY_CREDENTIALS, password);
userEnv.put(Context.SECURITY_PROTOCOL, "ssl");
userEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
try {
new InitialLdapContext(userEnv, null).close();
log.info("LDAP登录, 用户验证成功 {}", username);
return true;
}
catch (Exception e) {
log.error("LDAP登录, 用户验证失败", username);
return false;
}
}
log.error("LDAP登录, 找不到用户 DN {} ", username);
return false;
}
catch (NamingException e) {
log.error("LDAP登录, 找用户异常 DN {} {} ", username, e.getMessage(), e);
return false;
}
}
}
Java实现LDAP登录的更多相关文章
- JAVA 通过LDAP获取AD域用户及组织信息
因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的A ...
- 在 Apache DolphinScheduler 上调试 LDAP 登录,亲测有效!
点击上方 蓝字关注我们 作者 | 小钻风 01 背景 当看这边文章时,那得恭喜您终于找到宝藏,这是梦开始的地方-- 使用 Apache DolphinScheduler 的小伙伴会遇到个挠脑袋的问题 ...
- OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证
导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览 ...
- JAVA操作LDAP总结
一.LDAP概念 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP. LDAP目录为数据库, ...
- Java爬虫模拟登录——不给我毛概二的H某大学
你的账号访问太频繁,请一分钟之后再试! 从大一开始 就用脚本在刷课 在专业课踢的只剩下一门C#的情况下 活活刷到一周的课 大二开始教务系统多了一个非常**的操作 退课池 and 访问频繁缓冲 难道,我 ...
- 配置OpenLDAP,Java操作LDAP,DBC-LDAP进访问
LDAP快速入门 1. LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的 ...
- JAVA中使用LDAP登录的三种方式
搜索中关于java 登录ldap,大部分会采用 cn=xxx,ou=xxx,dc=xxx的方式,此处的cn是用户的Display Name,而不是account,而且如果ou有多层,比如我们的OU就 ...
- XWIKI离线WAR包部署(LDAP登录)
背景 接任务部署一个wiki, 要求: java语言开发, 开源, 内网部署; 需要支持: 大文件上传(300m左右), 所见即所得(wycwyg), 导出, LDAP, 评论与权限. 通过一个好用的 ...
- java同步ldap实例
1.准备过程 1.1 在windows server 2008 R2操作系统下搭建AD域,不懂得看链接地址:http://99532720.blog.51cto.com/2194488/696611 ...
- JAVA使用Ldap操作AD域
项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...
随机推荐
- dateFormater:格式化时间
function dateFormater(formater, t){ let date = t ? new Date(t) : new Date(), Y = date.getFullYear() ...
- 纯HTML5+CSS3实现一棵自己跳舞的树
代码没有多少,也没有用到任何图片,就实现了一棵可以自己跳舞的树.文件组成就简简单单的一个html和一个css html部分并不是很复杂,就是一些空的div,然后加上html模板也就那么十来行代码 最关 ...
- Htq-基于Node.js的异步队列
github: https://github.com/star7th/htq 部分介绍: 先介绍下基本概念. 我们在编写程序时,偶尔会遇到需要用到异步队列的情况.比如说,我发送一万封邮件,如果单纯使用 ...
- Blazor 组件库 BootstrapBlazor 中EditorForm组件介绍
组件介绍 EditorForm 组件是一个非常实用的组件,当进行数据编辑时,仅需要将 Model 属性赋值即可. 绑定模型默认自动生成全部属性,可以通过设置 AutoGenerateAllItem 更 ...
- Lambda【1】-- List相关Lambda表达式使用(上篇)
Lambda在jdk1.8里面已经很好用了,在这里不讲底层的实现,只有简单的用法,会继续补全. 首先一个list我们要使用lambda的话,需要使用它的stream()方法,获取流,才能使用后续的方法 ...
- SEEDLab —— 环境变量与 Set-UID 实验
[软件安全]实验1--环境变量与 Set-UID 实验 Task 1:配置环境变量 使用printenv或env指令来打印环境变量: 如果只想打印特定的环境变量,如PWD变量,可以使用printe ...
- JAVA8的computeIfAbsent使用方法
基础说明 computeIfAbsent 是 Java 8 引入的 Map 接口中的一个默认方法.它允许你以原子操作的方式在给定键不存在时计算其值,并将其添加到映射中.如果该键已经存在,则返回已存在的 ...
- 《前端运维》一、Linux基础--12网络
这是linux部分的最后一篇内容,我们一起来学习下Linux网络. 我们先看些命令吧: ifconfig,查看与配置网络状态. netstat,查询网络状态,常用选项如下: -t,列出TCP协议端口 ...
- OS之《死锁》
什么是死锁 一组进程中的每一个进程都在等待仅由该组进程中其他进程才能引发的事件,这样就形成死锁了. 死锁的原因 竞争不可抢占的资源 竞争可消耗资源 进程推进顺序不当 死锁产生的必要条件 1.互斥条件: ...
- 切换Docker本地目录
背景: df -h,发现docker默认的路径在/var/lib下,而且容量即将满掉. 对于欧拉系统来说,目录在/home,需要把docker目前的目录切换到/home下. 解决方法: 1. Dock ...