初学LDAP时关于objectClass和Attribute之间的关系总是困扰着我,找过许多的中文资料都没有得到答案。最近终于彻底弄明白了这个问题,决定记录下来,以让后学者少走弯路。非常奇妙的是他们之间的关系与Java里面的一些概念很相似,接下来我会结合Java 来讲讲LDAP中的objectClass与Attribute。
LDAP中每一个Entry必须属于某一个objectClass,用Java的方式来理解这个Entry对应着一个Instance,而 objectClass自然就是class了。
在Java中Class大致可以分为Abstract,concrete两种,只有concrete Class才能生成instance。而在LDAP中objectClass分为三种:Abstract,Structural,AUXIALIARY。具体定义如下:
* Abstract object classes are only intended to be extended by other object classes. An entry must not contain any abstract class unless it also contains a structural or auxiliary class that dervies from that abstract class (i.e., includes a non-abstract object class which has the abstract class in its inheritance chain). All entries must contain at least the “top” abstract object class, in the inheritance chain for their structural class. They may or may not contain other abstract classes in the inheritance chains for their structural class or any of their auxiliary classes.
* Structural object classes are intended to define the crux of what an entry represents. Every entry must include exactly one structural object class chain, and the root of that chain must ultimately be the “top” abstract object class. The structural object class for an entry is not allowed to be changed.
* Auxiliary object classes are intended to define additional qualities of entries. An entry may contain zero or more auxiliary classes, and the set of auxiliary classes associated with an entry may change over time.
简单描述就是:Abstract只用来被其它object class继承,只有当其被Structural object class继承时才出现。要定义一个Entry必须有且只有一个Structural类型的ObjectClass。 Top是一个顶级Abstract ObjectClass,里面定义了一个MUST Attribute:ObjectClass,这就决定了必须有一个其它的Structural ObjectClass才能定义一个Entry.其中ObjectClass又可以存在继承关系,该继承关系于Java中有点相似,子ObjectClass会继承父ObjectClass中的全部Attributes.
接下来看一看ObjectClass与Attribute的关系。
如同Java里面的一个类可以包括多个Field,在业务上可能会定义某些Field是必须的,另外一些是可选的。在LDAP中也存在类似关系,每一个 ObjectClass都定义了一些Attribute,其Attribute仍然可以是ObjectClass。在这些Attriubte中分为两种类型MUST,MAY, MUST表示这个Entry必须包括的属性,MAY为可选。一个ObjectClass的Attribute也包括所有继承自父ObjectClass和自身定义的ObjectClass。
下面用一个类型进行说明:
objectclass ( 2.5.6.0 NAME ‘top’ ABSTRACT
MUST objectClass )
objectclass ( 1.3.6.1.4.1.1466.344 NAME ‘dcObject’
DESC ‘RFC2247: domain component object’
SUP top AUXILIARY
MUST dc )
上面是两个objectclass的定义,其中top为ABSTRACT,dcObject为AUXILIARY,这两个类型都不能定义Entry.下面这个LDIF文件在导入到LDAP时会出错:
dn: dc=java,dc=com
objectClass:dcObject
dc: java.com
要定义这个Entry必须找到一个STRUCTURAL类型的ObjectClass。
objectClasses: ( 2.5.6.4 NAME ‘organization’
DESC ‘RFC2256: an organization’ SUP top STRUCTURAL
MUST o
MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory
$ x121Address $ registeredAddress $ destinationIndicator
$ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier
$ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber
$ street $ postOfficeBox $ postalCode $ postalAddress
$ physicalDeliveryOfficeName $ st $ l $ description ) )
这个objectClass的类型为STRUCTURAL,因此可以用来定义Entry.具体定义如下
dn: dc=java,dc=com
objectClass:dcObject
objectClass:organization
dc: java.com
o: java.com
其中dc:java.com为dcObject的MUST Attribute,o: java.com为organization的MUST Attribute。
相关推荐
### LDAP提示Object Class Violation详解 #### 一、问题背景 在LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)的使用过程中,有时会遇到一个常见的错误提示:“object class violation”。这一...
LDAP Schema是LDAP目录服务的重要组成部分,它通过定义ObjectClass、Attribute、Syntax和Matching Rules等核心要素,确保了目录数据的一致性和完整性。了解这些基本概念对于正确配置和管理LDAP服务器至关重要。希望...
# ldapsearch -x -b '' -s base '(objectclass=*)' ``` 如果看到有相关信息输出,就说明 OpenLDAP 已经正常运行了。 步骤5:建立根 最后,需要建立根目录。使用以下命令: ``` # touch base.ldif ``` 并编辑 `base...
在 LDAP 中,objectClass 的定义可以来自多个来源,包括标准的 LDAP_schema、 vendor-specific schema 和自定义的 schema。每个 objectClass 都有其对应的属性和语义,这些属性可以是必须的、可选的或是禁止的。 ...
3. **ObjectClass**:定义实体可以拥有的属性及其必需属性,形成了层次化的结构。 4. **Schema**:由Object Classes和属性类型组成,定义了可存储在目录中的实体类型。 #### 五、构建目录树与信息编目 1. **构建...
(&(|(objectclass=dominoPerson)(objectclass=dominoGroup)(objectclass=dominoServerMailInDatabase))(mail=*)) ``` - **解析**:此查询返回Lotus Domino LDAP中所有被标记为"dominoPerson"或"dominoGroup"的...
| objectClass:object_class | 对象类,用于定义条目所遵循的规则集,标识了哪些属性是必需的以及哪些是可选的。 | | attribute_type | 属性类型,应在模式中定义。 | | [subtype] | 可选。指定属性值的子类型:...
objectClass: organizationalRole cn: appuser 新建文件 init3.ldif,此文件就是雇员的 LDAP 用户: dn: cn=GUESTCST,dc=hysh,dc=com cn: GUESTCST description: username=GUESTCST password=GUESTCST objectClass...
ldap.auth.userObjectsFilter=(objectclass=posixAccount) ``` 3. 启用 LDAP 认证:在 confluence/WEB-INF/classes/confluence-init.properties 文件中添加以下配置,启用 LDAP 认证: ``` confluence.authenticate....
SearchRequest.Filter := '(objectClass=user)'; SearchRequest.Scope := sdSubtree; Results := LDAPClient.Execute(SearchRequest); // 处理Results中的数据 finally SearchRequest.Free; end; end; ``` 5...
- `ldap_search_s(ld, sdn, LDAP_SCOPE_SUBTREE, "(objectclass=*)")`:搜索整个子树(`LDAP_SCOPE_SUBTREE`)下满足`objectclass=*`条件的所有条目。 - 循环遍历每个搜索结果条目,并打印出DN以及所有属性值。 #####...
objectClass: organizationalPerson objectClass: inetOrgPerson cn: John Doe sn: Doe givenName: John uid: jdoe userPassword: password ``` 这段代码定义了一个名为“John Doe”的用户,拥有多个对象类,并包含...
如何将对ldap的操作与对oracle的操作封装在一个事务中? 如何处理分布的database,LDAP事务? 详见项目代码 其中测试文件位置:src\test\com\aua\service\impl\StudentServiceTest.java spring配置文件位置: src...
LDAP 支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(ObjectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:...
例如,`(&(objectClass=user)(uid=bob))` 这个过滤器会返回所有用户类(objectClass=user)且用户名为 bob 的条目。 4. **LDAP目录结构**:理解目录结构是有效使用 LDAP 的前提。目录通常由一系列具有层级关系的...
NamingEnumeration results = ctx.search("ou=people,o=tcl,c=cn", "(objectClass=inetOrgPerson)", new SearchControls()); ``` 这些操作都可以使用 `DirContext` 对象来实现。开发者可以根据需要选择合适的方法来...
String filter = "(objectClass=*)"; LDAPSearchResults results = connection.search("dc=example,dc=com", LDAPConnection.SCOPE_SUB, filter, null, false); while (results.hasMore()) { LDAPEntry entry =...
5. **搜索过滤器(Search Filter)**:在 LDAP 搜索时使用的条件表达式,如 `(objectClass=person)`。 **PHP LDAP 函数** 1. **ldap_connect()**:创建到 LDAP 服务器的连接。 2. **ldap_bind()**:绑定到 LDAP ...