`

Java命名目录接口(JNDI)教程--LDAP用户的高级主题

阅读更多

LDAP用户的高级主题

本节提供LDAPJNDI之间映射的详细信息。同时提供使用JNDI访问LDAP服务器的暗示和提示。

LDAP

X.500,一个CCITT的目录服务器标准,是OSI否为套件的一部分。X.500标准定义了客户端应用程序访问X.500目录的协议,叫做目录访问协议(DAP)。它在开放系统互连(OSI)协议栈的顶层。

因特网委员会认为需要X.500类型的访问但底层的网络基础架构(是TCP/IP而不是OSI)不同,基于X.500 DAP协议设计了一个新协议,叫做轻量级DAPLDAPRFC 2251定义了成为版本3LDAPLDAPv3),这是它的前身LDAP v2RFC 1777)的改进。

LDAP协议的目的是容易实现,特别是创建小的简单的客户端。一种尝试简化的成果是大量使用字符串来减少结构的使用。例如DN,在协议中以字符串表示,属性类型名和大多数属性值也是如此。

这个协议包含客户端向服务器发送的请求,对于服务器的应答,不需要按照请求的顺序进行。每一个请求有一个ID,所以请求和应答可以匹配。这个协议可以工作在TCPUDP中,最常用的是TCP

因为焦点在客户端,LDAP组织同时定义了DN的字符串表达(RFC 2553),搜索过滤器(RFC 1960),属性语法(RFC 1778),为C语言提供的APIRFC 1823),访问LDAP访问的URL格式(RFC 1959)。

LDAP v3支持国际化,多种认证技术,referral,以及一般的部署技术。使用extensionscontrols添加新特性时不需要修改协议。

LDAP v3

国际化

国际化是通过国际化字符集(ISO 10646)表示协议中的字符串元素(例如DN)。v3v2不同,v2使用UTF-8编码字符串。

认证

除了匿名,简单(明文密码)认证,LDAPv3使用简单认证以及安全层(SASL)认证架构(RFC 2222)允许在LDAP中使用不同的认证技术。SASL定义了客户端和服务器之间数据交换的认证的挑战-应答协议。

现在定义了一些SASL技术:DIGEST-MD5, CRAM-MD5,匿名,扩展,S/Key, GSSAPI以及Kerberos v4LDAP v3客户端可以使用任意一种SASL技术,提供给支持这种技术的LDAP v3服务器。而且,新的(还没有定义的)SASL技术可以在不改变LDAP的情况下使用。

referrals

referral是服务器发送个客户端的信息,表示请求的信息可以在其他地方发现(很可能是其他服务器)。在LDAP v2中,服务器由服务器处理referral,不返回到客户端。因为实现referral是非常负载的并且可能导致很复杂的客户端。当服务器构建以及部署后,referral就变得十分有用,但不是很多服务器支持服务端的referral处理。所以,使用一种方法修改协议允许返回referral。通过在将referral放置在“partial result”错误应答的错误信息中实现。

LDAP v3显式支持referrals,允许服务器直接向客户端返回referralsreferrals不再本课中介绍,您可以求助于JNDI教程关于符合在应用程序中控制referrals的信息。

部署

LDAP这种普通协议可以用来确保目录客户端和服务器“说同一种语言”。当不同的目录客户端和服务器部署在网络中时,这些实体都说同样的对象是非常有用的。

目录架构描述,在其他东西中间,对象的类型,目录可能有的对象的类型,对象的每个必须的或可选属性。LDAP v3定义架构(RFC 2252 RFC 2256)基于X.500标准为了在网络中查找基本对象定义,例如,国家,地区,组织,用户/人,用户组和设备。它定义了客户端访问服务器架构的方法,所以可以发现对象的类型以及服务器支持的属性。

LDAPv3进一步定义了表示属性值的一组语法(RFC 2252)。要编写访问架构信息的Java应用程序,请参考JNDI教程。

扩展

除了预定义的所有操作,例如“search”和“modify”之外,LDAPv3定义了“extended”操作。“extended”将请求当作参数并且返回应答。请求中包含标识请求的标识符和请求参数。应答中包含请求执行的结果。“extended”操作中的请求和应答叫做扩展。例如,可以为开始TLS定义扩展,它是客户端向服务器的请求,用来开始Start TLS协议。

扩展可以是标准的(LDAP委员会定义的)或者私有的(由供应商定义)。要编写使用扩展的程序请参考JNDI教程。

Controls

添加新特性的另一种方法是使用controlLDAP v3允许通过使用control修改所有操作的行为。一个操作中可以发送任意多个control,同时结果中也可以返回任意数量的control。例如,您可以和“search”操作一起发送排序control,告诉服务器根据“name”属性对结果进行。

和扩展一样,control可以是标准的也可以是私有的。标准control由平台提供。编写使用control的应用程序请参考JNDI教程。

JNDI作为LDAPAPI

JNDILDAP的模型在命名对象时都使用层次结构的名字空间。名字空间中的每一个对象都可能有属性,而且这些属性可以用来搜索对象。在这种层次上,两个模型是类似的,所以JNDI可以对LDAP进行很好的映射也没有什么稀奇的。

模型

您可以将LDAP的条目想象成JNDIDirContext。每个LDAP条目包含名称和一组属性,以及可选的子条目集合。例如,LDAP条目“o=JNDITutorial”可能有属性“objectclass”和“o”,同时可能有子条目“ou=Groups”和“ou=People”。

JNDI中,LDAP条目“o=JNDITutorial”可以表示成名为“o=JNDITutorial”的上下文,它有两个子上下文,名叫“ou=Groups”和“ou=People”。LDAP条目属性使用Attributes接口表示,而独立的属性通过Attribute接口表示。

关于LDAP操作如何通过JNDI进行访问的详细信息请参考下一部分。

名字

为了联合查询,您提供给JNDI上下文方法的名称可以跨越多个命名空间。这些叫做混合名字。当使用JNDI访问LDAP服务时,您需要明白字符串中的斜杠(“/”)在JNDI中特殊的含义。如果JNDI条目包含这个字符,需要进行转义(使用“\”)。例如,使用名称“cn=O/R”的LDAP条目在JNDI context的方法中,必须使用“cn=O\\/R”标识。关于名字的更多信息,请参考JNDI教程。LdapNameRdn类简要介绍了创建和操作LDAP名字的方法。

协议中LDAP的名称总是完全的名字,表示从LDAP命名空间根开始的唯一条目(由服务器定义)。以下是一些LDAP全名的例子:

 

cn=John Smith, ou=Marketing, o=Some Corporation, c=gb

cn=Vinnie Ryan, ou=People, o=JNDITutorial

 

然而,在JNDI中,名字是相对的,即,您总是相对于上下文命名对象。例如,您可以相对于上下文“ou=People, o=JNDITutorial”对“cn=Vinnie Ryan”条目进行命名。或者,您可以相对于上下文“o=JNDITutorial”对条目“cn=Vinnie Ryan, ou=People”进行命名。或者,您可以创建初始上下文指向LDAP服务器命名空间的根,然后命名条目“cn=Vinnie Ryan, ou=People, o=JNDITutorial”。

JNDI中,您同样可以使用LDAPURL来命名LDAP条目。请参考JNDI教程中的LDAP URL讨论。

LDAP操作如何映射到JNDI API

LDAP定义了一组操作或请求(RFC 2251)。在JNDI中,这些操作被映射到DirContextLdapContext接口中,它们都是Context的子接口。例如,当请求DirContext中的方法时。LDAP服务提供者通过将LDAP请求发送给LDAP服务器实现这个操作。

下表描述和LDAP操作对应的JNDI方法:

 

LDAP操作

对应的JNDI方法

bind

这是创建LDAP服务器初始连接的方式,对应JNDI中创建InitialDirContext对象。当应用程序创建初始上下文,它在环境参数中向服务器提供客户端认证信息。要修改一个已经存在上下文的认证信息,使用Context.addToEnvironment()Context.removeFromEnvironment()

Unbind

Context.close()用来释放上下文使用的资源。服务提供者的实现和LDAPunbind操作有一些不同,资源在上下文之间共享,所以关闭上下文当资源被其他上下文使用时就不会释放。如果您的意图是释放所有资源,需要关闭所有上下文。

Search

JNDI中对应方法是DirContext.search()中接收搜索过滤器(RFC 2254)的重载形式。

modify

JNDI中对应方法是DirContext.modifyAttributes()中接收DirContext.ModificationItems数组的重载形式。示例请看修改属性一节。

Add

JNDI中对应方法是DirContext.bind()DirContext.createSubcontext()。您可以使用它们添加一个新的LDAP条目。使用bind(),您不但需要指定新条目的属性集合同时需要和属性一起的Java对象。示例请参考关联属性的添加、替换绑定一节。

Delete

JNDI中对应的方法是Context.unbind()Context.destroySubcontext()。您可以使用它们移除LDAP条目。

modify DN/RDN

JNDI中对应方法是Context.rename()。请参考重命名对象一节得到详细信息。

compare

JNDI中可以使用DirContext.search()代替。示例请参考LDAP比较操作一节。

abandon 

当您关闭上下文时,所有没有应答的请求都被放弃。类似的,当关闭NamingEnumeration,相应的LDAPsearch”请求也放弃了。

Extended操作

JNDI中对应的方法是LdapContext.extendedOperation()。详细信息请参考JNDI教程。

 

LDAP错误码如何映射到JNDI异常

LDAP定义了一组状态码,它们是由LDAP服务器作为应答发送给客户端的(RFC 2251)。在JNDI中,错误条件由Naming Exceptions子类的检查的异常标识。请参考JNDI异常类概述中的Naming Exceptions

 

LDAP状态码

含义

异常或操作

0

成功

报告成功

1

操作错误

NamingException

2

协议错误

CommunicationException

3

达到时间限制

TimeLimitExceededException

4

达到大小限制

SizeLimitExceededException

5

比较失败

DirContext.search()方法使用,不产生异常。

6

比较成功

DirContext.search()方法使用,不产生异常。

7

认证方式不支持

AuthenticationNotSupportedException

8

需要更强的认证

AuthenticationNotSupportedException

9

只返回部分数据

如果环境参数“java.naming.referral”是“ignore”或错误的内容不包含referral,抛出PartialResultException。否则,使用内容创建一个referral

10

发生referral

如果环境参数“java.naming.referral”是“ignore”,则忽略。如果参数是“throw”,抛出ReferralException。如果属性是“follow”,由LDAP提供者处理referral。如果超过“java.naming.ldap.referral.limit”限制,抛出LimitExceededException

11

达到管理限制

LimitExceededException

12

不支持的关键扩展请求

OperationNotSupportedException

13

需要机密信息

AuthenticationNotSupportedException

14

SASL绑定中

LDAP提供者在认证过程中使用。

16

属性不存在

NoSuchAttributeException

17

未定义属性类型

InvalidAttributeIdentifierException

18

不合适的匹配

InvalidSearchFilterException

19

常量违例

InvalidAttributeValueException

20

属性值正在使用中

AttributeInUseException

21

属性语法错误

InvalidAttributeValueException

32

对象不存在

NameNotFoundException

33

别名错误

NamingException

34

DN语法非法

InvalidNameException

35

是叶子节点

LDAP提供者使用,通常不产生异常。

36

别名解析错误

NamingException

48

不合适的认证

AuthenticationNotSupportedException

49

机密信息非法

AuthenticationException

50

访问权限不足

NoPermissionException

51

ServiceUnavailableException

52

不可得

ServiceUnavailableException

52

服务器不愿执行

OperationNotSupportedException

54

检测到循环

NamingException

64

命名违例

InvalidNameException

65

对象类型违例

SchemaViolationException

66

非叶子节点不允许操作

ContextNotEmptyException

67

不允许在RDN上操作

SchemaViolationException

68

条目存在

NameAlreadyBoundException

69

va
分享到:
评论

相关推荐

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它允许程序查找和操作各种命名和目录服务,如 Lightweight Directory Access Protocol (LDAP)、Java Database Connectivity ...

    jndi.zip_java ldap_jndi_jndi ldap_ldap_ldap java

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的一组API。在本案例中,我们关注的是JNDI与Lightweight Directory Access Protocol (LDAP) 的结合使用,这是一个广泛应用于分布式...

    com.sun.jndi.ldap.jar

    JNDI是一个接口,提供了一种标准的方式来访问命名和目录服务,而LDAP则是一种网络协议,常用于存储和查询用户账户、组信息、配置数据等结构化信息。 JNDI的主要作用是将Java应用程序与各种不同的命名和目录服务连接...

    JNDI访问LDAP

    **JNDI(Java Naming and Directory Interface)**是Java平台中的一个标准API,它允许Java应用程序访问各种命名和目录服务,如LDAP(Lightweight Directory Access Protocol)。在Java应用中,JNDI通常用于管理和...

    LDAP实现AD域账号验证 - Java/SpringBoot

    JNDI提供了一个统一的API,可以与各种目录和命名服务交互。为了连接到AD服务器,我们需要配置连接参数,如服务器地址、端口、基DN(Base DN)以及认证信息。 SpringBoot则提供了一种更优雅的方式来集成LDAP。通过...

    jndi-tool JNDI服务利用工具

    JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准接口,用于访问命名和目录服务。它允许程序查找和操作存储在不同类型的命名或目录服务中的对象,如 LDAP(Lightweight Directory Access ...

    jndi-1.2.1.jar.zip

    JNDI的主要目标是提供一种统一的接口,使得Java应用程序可以透明地访问各种类型的命名和目录服务,如DNS、LDAP(轻量级目录访问协议)、RMI(远程方法调用)注册表等。通过JNDI,开发者无需了解底层服务的具体实现,...

    JNDI 命名和目录服务

    【JNDI命名和目录服务】是JAVA编程中的一项核心技术,它提供了对各种命名和目录服务的统一访问接口。JNDI,全称为Java Naming and Directory Interface,它不是具体的命名或目录服务,而是一组API,使得Java程序能够...

    Java 命名和目录服务的接口

    ### Java 命名和目录服务的接口 (JNDI) #### 一、JNDI 概述 Java Naming and Directory Interface(JNDI)是Java平台提供的一个标准API,用于实现应用程序与命名及目录服务之间的交互。它类似于Java Database ...

    027-JNDI之初探 LDAP.pdf

    JNDI(Java Naming and Directory Interface)是Java平台的一部分,提供了一个标准API,用于访问命名和目录系统。它允许应用程序通过一个统一的接口进行对不同命名和目录服务的查找和访问操作。JNDI References是...

    rmi-jndi-ldap-jrmp-jmx-jms:rmi,jndi,ldap,jrmp,jmx,jms一些演示测试

    在“rmi-jndi-ldap-jrmp-jmx-jms”这个项目中,可能包含了对这些技术的实际应用和测试代码。开发者可能创建了各种示例,如RMI服务端和客户端的交互,JNDI查找和绑定对象到LDAP目录,JRMP的远程调用,JMX监控应用程序...

    java LDAP操作

    JNDI是Java平台的一个核心部分,它提供了一种统一的接口,用于访问各种命名和目录服务,包括LDAP。通过JNDI,Java程序员可以查找、绑定、更新和删除目录中的条目,而无需关心具体的目录服务实现。 ### 2. LDAP目录...

    jndi简明教程

    JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名服务和目录服务的一套标准API。它为开发者提供了访问不同类型的命名和目录服务(如DNS、LDAP等)的一致接口。 **命名服务**:命名服务是将...

    apacheds-server-jndi-1.0.1.jar.zip

    JNDI接口使得开发者能够通过Java代码与ApacheDS进行交互,进行用户账户的创建、查询、更新等操作,而无需直接处理复杂的LDAP操作。 这个压缩包中的主要文件"apacheds-server-jndi-1.0.1.jar"是ApacheDS Server JNDI...

    JNDI Java操作示例

    JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的API。它提供了一种查找和定位应用程序所需的资源(如数据库连接、消息队列、EJBs等)的方式。在本文中,我们将通过一个具体的示例...

    初学ldap和jndi

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)是Java平台提供的一个API,它使得Java应用程序能够以统一的方式访问多种命名和目录服务。JNDI支持LDAP、RMI(Remote Method Invocation)、DNS等...

    JNDI简介

    * Java 2 SDK 1.4.x 的最新版本进行了改进,将以下命名/目录服务提供程序包括进来:LDAP 服务提供程序、CORBA COS 命名服务提供程序、RMI 注册表服务提供程序、DNS 服务提供程序等。 JNDI 是一个功能强大且灵活的 ...

    SpringLDAP和JNDI的增删改查

    在Java开发中,当我们需要与目录服务进行交互,例如用户认证、权限管理等,Spring LDAP和Java Naming and Directory Interface (JNDI)是两个常用的技术。本文将通过一个入门级的例子,详细介绍如何利用Spring LDAP和...

Global site tag (gtag.js) - Google Analytics