千家信息网

LDAP举例分析

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"LDAP举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"LDAP举例分析"吧!LDAP初探首先要先理解什么是LDAP,当时我
千家信息网最后更新 2025年12月03日LDAP举例分析

这篇文章主要讲解了"LDAP举例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"LDAP举例分析"吧!

LDAP初探

首先要先理解什么是LDAP,当时我看了很多解释,也是云里雾里,弄不清楚。在这里给大家稍微捋一捋。 首先LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。在这套标准下,AD(Active Directory)是微软出的一套实现。 那AD是什么呢?暂且把它理解成是个数据库。也有很多人直接把LDAP说成数据库(可以把LDAP理解成存储数据的数据库)。像是其他数据库一样,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。 而我们通常说的LDAP是指运行这个数据库的服务器。 可以简单理解AD =LDAP服务器+LDAP应用。

那LDAP这种数据库有什么特殊的呢?

我们知道,像MySQL数据库,数据都是按记录一条条记录存在表中。而LDAP数据库,是树结构的,数据存储在叶子节点上。看看下面的比喻:

假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有"分叉"(ou),最后就是这个苹果的名字(uid,相当于MySQL表主键id)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵"歪脖树"的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!

就这样就可以描述清楚"树结构"上的一条记录了。 说一下LDAP里如何定义一个记录的位置吧。

树(dc=ljheee) 分叉(ou=bei,ou=xi,ou= dong) 苹果(cn=redApple)

好了,redApple的位置出来了: dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee 其中dn标识一条记录,描述了一条数据的详细路径。 咦!有人疑问,为什么ou会有多个值?你想想,从树根到达苹果的位置,可能要经过好几个树杈,所有ou可能有多个值。关于dn后面一长串,分别是cn,ou,dc;中间用逗号隔开。

总结一下LDAP树形数据库如下: dn :一条记录的详细位置 dc :一条记录所属区域 (哪一颗树) ou :一条记录所属组织 (哪一个分支) cn/uid:一条记录的名字/ID (哪一个苹果名字) LDAP目录树的最顶部就是根,也就是所谓的"基准DN"。

为什么要用LDAP目录树来存储数据,用MySQL不行吗,为什么非要搞出一个树形的数据库呢? 这是因为用树形结构存储数据,查询效率更高(具体为什么,可以看一下关系型数据库索引的实现原理--B树/B+树)。在某些特定的场景下,使用树形数据库更理想。比如:需要储存大量的数据,而且数据不是经常更改,需要很快速的查找。 把它与传统的关系型数据库相比,LDAP除了快速查找的特点,它还有很多的运用场景,比如域验证等。

LDAP编程操作

我们可以用JDBC操作MySQL数据库,进行对数据的增删改查。同样,LDAP树形数据库,也可以通过JDBC方式;除此之外,还可以用JNDI的方式(更推荐),因为树形可以看做是目录,树结构的枝杈相当于目录的层级。

还有LDAP数据库展示数据也是树形的,可以把ApacheDirectoryStudio看做是连接数据库服务器的界面化的client,相当于Navicat、WorkBench。新建连接,连接数据库服务器的操作类似。

JNDI连接LDAP服务器

import org.springframework.beans.factory.annotation.Autowired;import java.util.Hashtable;import javax.naming.*;import javax.naming.directory.Attribute;import javax.naming.directory.Attributes;import javax.naming.directory.DirContext;import javax.naming.directory.InitialDirContext;public class LdapJNDI {@AutowiredLdapConfiguration ldapConfiguration;public void JNDILookup() {    String rootFilter = "o=cvte.com,o=isp";//        String filter = "(&(smart-type=E1)(smart-status=1))";    String filter = "(&(smart-type=E1)(uid=00012047))";    String username = "uid=USER_NAME,ou=Authorization,ou=People,o=cc.com,o=isp";//xxx为申请的对接账户    String password = "PASSW";    Hashtable env = new Hashtable();    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");//设置连接LDAP的实现工厂    env.put(Context.PROVIDER_URL, "ldap://172.26.39.77:389/" + rootFilter);// 指定LDAP服务器的主机名和端口号    env.put(Context.SECURITY_AUTHENTICATION, "simple");//给环境提供认证方法,有SIMPLE、SSL/TLS和SASL    env.put(Context.SECURITY_PRINCIPAL, username);//指定进入的目录识别名DN    env.put(Context.SECURITY_CREDENTIALS, password); //进入的目录密码    env.put("filter",filter);    DirContext ctx = null;    try {        // 得到初始目录环境的一个引用        ctx = new InitialDirContext(env);        //The search base entry 'uid=00012047,ou=Internal,ou=People,o=cvte.com,o=isp' does not exist]; remaining name 'uid=00012047,ou=Internal'//            Attributes attrs = ctx.getAttributes("uid=00012047,ou=Internal,ou=People");//获取到一个人员,        NamingEnumeration bindings = ctx.listBindings("ou=Internal,ou=People");//列举 内部人员        while (bindings.hasMore()) {            Binding bd = (Binding)bindings.next();            System.out.println(bd.getName() + ": " + bd.getObject());        }         /*根据结点的DN来查找它的所有属性, 然后再从属性中得到所有的值,注意一个属性可以有多个值*///            for (NamingEnumeration ae = attrs.getAll(); ae.hasMore(); ) {//                //获取一个属性//                Attribute attr = (Attribute) ae.next();//                for (NamingEnumeration ve = attr.getAll(); ve.hasMore(); ) {//                   System.out.println(String.format("Attribute=%s,Value=%s",attr.getID(),ve.next()) );//                }//            }    } catch (javax.naming.AuthenticationException e) {        System.out.println("认证失败");        e.printStackTrace();    } catch (Exception e) {        System.out.println("认证出错:");        e.printStackTrace();    }finally {        if (ctx != null) {            try {                ctx.close();            } catch (NamingException e) {                e.printStackTrace();            }        }    }}public static void main(String[] args) {    LdapJNDI ldapJNDI = new LdapJNDI();    ldapJNDI.JNDILookup();}

感谢各位的阅读,以上就是"LDAP举例分析"的内容了,经过本文的学习后,相信大家对LDAP举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 数据库 树形 目录 苹果 位置 服务器 服务 就是 分析 结构 存储 名字 多个 属性 学习 认证 清楚 人员 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 宣城医院软件开发多少钱 济南云畅网络技术有限公司 access数据库控件求和 有没有关于组织标本的免费数据库 广州云盈网络技术有限公司 上海智能化网络技术开发行业标准 数据库实现if 水文数据库建设 数据库可以提供可信验证 在数据库中图片是什么类型 视频加密软件开发 书 学校网络安全管理工作汇报 sql 数据库新建表 深圳手机软件开发费用是多少 万方数据库《科技博览》 软件开发去哪里培训 漯河网络安全生产峰会 北京桂圆网络技术有限公司 湘雅医院网络安全招聘 公元图片数据库 如何找报纸的数据库 什么数据库是全文数据 虚拟库数据库怎么连接不上 河北高科技软件开发服务供应 单机版软件如何连接远程数据库 计算机网络技术基础概念 浦东新区网络技术咨询大概费用 南昌网络技术服务 诛仙3找不到服务器怎么办 湘雅医院网络安全招聘
0