LDAP的全称是Lightweight Directory Access Protocol(轻量级目录访问协议),是一种用于访问和管理分布式目录信息服务的应用协议。LDAP通常用于存储用户、组和其他组织信息,提供对这些信息的快速查询和管理。

  LDAP 是基于X.500标准的一个简化版本,使用更简单的网络协议(如 TCP/IP)来实现,定义了客户端如何与目录服务交互,如添加、删除、修改或查询目录信息。

例:

Java原生支持LDAP协议,通过管理员账户adminDnadminPassword连接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登录的更多相关文章

  1. JAVA 通过LDAP获取AD域用户及组织信息

    因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的A ...

  2. 在 Apache DolphinScheduler 上调试 LDAP 登录,亲测有效!

    点击上方 蓝字关注我们 作者 | 小钻风 01 背景 当看这边文章时,那得恭喜您终于找到宝藏,这是梦开始的地方-- 使用 Apache  DolphinScheduler 的小伙伴会遇到个挠脑袋的问题 ...

  3. OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证

    导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览 ...

  4. JAVA操作LDAP总结

    一.LDAP概念 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP. LDAP目录为数据库, ...

  5. Java爬虫模拟登录——不给我毛概二的H某大学

    你的账号访问太频繁,请一分钟之后再试! 从大一开始 就用脚本在刷课 在专业课踢的只剩下一门C#的情况下 活活刷到一周的课 大二开始教务系统多了一个非常**的操作 退课池 and 访问频繁缓冲 难道,我 ...

  6. 配置OpenLDAP,Java操作LDAP,DBC-LDAP进访问

    LDAP快速入门 1. LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的 ...

  7. JAVA中使用LDAP登录的三种方式

    搜索中关于java 登录ldap,大部分会采用  cn=xxx,ou=xxx,dc=xxx的方式,此处的cn是用户的Display Name,而不是account,而且如果ou有多层,比如我们的OU就 ...

  8. XWIKI离线WAR包部署(LDAP登录)

    背景 接任务部署一个wiki, 要求: java语言开发, 开源, 内网部署; 需要支持: 大文件上传(300m左右), 所见即所得(wycwyg), 导出, LDAP, 评论与权限. 通过一个好用的 ...

  9. java同步ldap实例

    1.准备过程 1.1  在windows server 2008 R2操作系统下搭建AD域,不懂得看链接地址:http://99532720.blog.51cto.com/2194488/696611 ...

  10. JAVA使用Ldap操作AD域

    项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...

随机推荐

  1. CF716B Complete the Word 题解

    CF716B Complete the Word 题解 分析 首先观察数据范围是 \(50000\),可以考虑 \(O(n)\) 暴力. 在字符串中枚举子串开始的位置 \(i\),然后再枚举 \(i\ ...

  2. 成本立降50%!在EKS上借助Karpenter部署大模型

    原文链接: https://aws.amazon.com/cn/blogs/containers/scaling-a-large-language-model-with-nvidia-nim-on-a ...

  3. php 安装扩展 event

    本地环境php8.1,然后我想安装event扩展,找了找资料,直接一句话 sudo pecl install event 然后执行的过程中提示这些 configure.ac:165: the top ...

  4. 为什么通常在发送数据埋点请求的时候要用GIF

    为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片? 能够完成整个 HTTP 请求+响应(尽管不需要响应内容) 触发 GET 请求之后不需要获取和处理数据.服务器也不需要发送 ...

  5. python 自动下载 moudle

    import sys,re,subprocess import os from subprocess import CalledProcessError new_set = set() ls = se ...

  6. Spring源代码解析(四):Spring MVC

    下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析Dispa ...

  7. 运维工具之saltstack

    参考:https://www.cnblogs.com/xintiao-/p/10380656.html saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现 ...

  8. Linux 文件删除空间没有释放问题

    最近阿里云频频告警.磁盘使用率飙升90%以上.遂查看磁盘使用情况 df -h 发现使用率却是很高 之后,通过du -h --max-depth=1 / 查看哪个目录下占用的资源较多并进行删除 后来发现 ...

  9. 基于Github gist的代码片段管理工具Lepton

    Lepton主要功能 无限制的公共/私人片段 无限制的标签 语言组 Markdown支持 Jupyter Notebook查看器支持 macOS / Win / Linux客户端 GitHub Ent ...

  10. TypeScript 笔记(一)

    1. TypeScript 的介绍 完整教程TypeScript 入门教程 TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准,由微软开发的自由和开源的编 ...