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登录的更多相关文章

  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. git 暂存区问题

    如果需要合别人的代码进来 需要暂时把自己的代码stash一下,用 git stash 放入暂存 如果需要释放出来用 git stash pop 当暂存用的越来越多,问题出现了需要清理暂存区队列,使用代 ...

  2. [python] Python异步编程库asyncio使用指北

    Python的asyncio模块提供了基于协程(coroutines)的异步编程(asynchronous programming)模型.作为一种高效的编程范式,异步编程允许多个轻量级任务并发执行,且 ...

  3. vue-elementui中el-table跨页选择和v-if导致列错乱/选择框无法显示

    在vue-elementui中使用el-table,当type="selection"的时候,分页数据进行不同页跳转选择 需要这种功能的时候我们需要在el-table的标签上为每个 ...

  4. 五、FreeRTOS学习笔记-任务创建和删除(动态方式)

    1任务控制块:保存任务的一些信息 (STM32的栈是由告高地址向低地址延伸的,由上向下生长) (STM32的堆是由告低地址向高地址延伸的,由下向上生长) 第一步申请内存 如下如所示步骤找到xTaskC ...

  5. elementui resetFields()不起作用

    需要结合prop才有作用

  6. CVE-2023-48409 Mali GPU 整数溢出导致堆越界写

    CVE-2023-48409 Mali GPU 整数溢出导致堆越界写 https://github.com/0x36/Pixel_GPU_Exploit 漏洞原语:假设分配的大小为 0x3004​, ...

  7. IOS快捷指令代码分享

    IOS快捷指令分享 制作快捷指令 首先在快捷指令APP上制作快捷指令 添加一些逻辑,具体可以自己体验 然后点击共享,获取iCloud链接 类似于这种 https://www.icloud.com/sh ...

  8. Linux NAS存储、文件共享

    Linux NAS存储之CIFS CIFS是Windows和Unix系统之间共享文件的一种协议,客户端通常是Windwos等.支持多节点同时挂载以及并发写入 1.服务器端操作(存储端) 1.1.服务器 ...

  9. PostgreSQL 的历史

    title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功 ...

  10. Xshell无法连接22端口问题解决办法汇总

    Xshell软件在进行远程连接过程中,会出现端口连接报错的问题,提示:"该IP地址的22端口连接失败",这是怎么回事?今天小编就xshell软件无法连接22端口的问题,整理相关情形 ...