ldap的shema

一、项目中,更新人员信息时会报异常

下面为提示:LDAP: error code 17 - virtualaccount: attribute type undefined

分析:1) 人员信息是存储在ldap中,应该是ldap中的人员没有这个属性

2)在ldap\etc\schema下找到人员信息的定义

# GalaxyPeople
objectclass	( 2.16.840.1.153730.3.2.22
    NAME 'GalaxyPeople'
	DESC 'GalaxyPeople use to manage people'
    SUP InetOrgPerson
    STRUCTURAL
	MAY (
		otherDepartmentNumber  $ sortid   $  ifactivated  $  peopleLevel $ leadermember $ leaderFilter $ title $ post $ globalsortid $ virtualaccount
	    )
	) 



MAY,即可选属性定义中确实没有virtualaccount属性

3)得出解决方式:增一个virtualaccount属性定义,在GalaxyPeople中添加。


二、基础知识

1、什么是LDAP的Schema?

在ldap中, shema用来定义你的ldap中可以有那些objectClass,这些objectClass又可以有那些Attribute,以及控制什么样的数据被存到哪里。

用数据库的概念来理解:任何的数据库都有一个Schema,Schema是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的Entry下的数据之间的关系。Attribute相当于字段(Field),而Object Calss相当于表。

当你搭建好你的LDAP后,一些已经定义好的Entry的信息存储在一系列的Attribute中的值中。你也可以创建一个要存储在LDAP中的新的值类型。

所有的Attribute可能被放到一起用来组成一个叫做Object Class的类型。为了满足你的需要,你可以定义自己的Object Class,每一个Object Class中的属性都可以设计成reqired(必选的)或optional(可选的)。

你可以设计你的LDAP信息树(DIT),在同一个Entry存储许多相似的Object Class。

2、理解LDAP的Attribute

简单的说,Attribute是可以存放一个单一类型信息的容器。(采用Key/Value进行对应)。

定制Schema可以使你设计很多你需要的Attribute,如你喜欢的食物、生日、工作日期等等,但你也不得不为你的目录服务器的配置文件(Schema)添加正确的Attribute。

一个Attribute包括以下几个部分,我们稍后会详细介绍。

n Attribute名字

n 描述

n Attribute的对象标识符(OID)

n 用于进行类型检查和模式匹配的语法

n Attribute是否允许有多个值

(1)什么是Attribute的名字?

这在概念上已经很清晰了,但在你自己创建一个新属性类型之前,你应该检查一下LDAP规范中是否已经存在能够满足你的要求的Attribute。你可以从下面这个站点查找已经定义好的object class的Attribute列表:http://www.ldapman.org/schema-references。

假设你需要的Attribute不存在,那么你要自己添加。首先你应该为自己将要添加的属性定义一个新的名字,需要注意的是你的Attribute的名字要避免与很可能成为“官方指定”的Attribute的名字冲突。

你可以用你的单位、公司甚至停车场的ID来作为你的Attribute的名字。当定义Schema时,Gizmo公司的LDAP的系统管理员很可能定义这样的名字作为Attribute名:"gizmoParkingPassNumber”。我们可以看到这个Attribute名字可以很好避免同日后的官方指定的Attribute名字冲突。

请注意“gizmoParkingPassNumber”作为Attribute看起来很优美,你应该养成这样的习惯:Attribute的名字的第一个字母必须小写,其他单词的第一个字母必须大写,其他的字母必须小写,并且你的Attribute名字应该足够长,这样可以根据你的Attribute的名字就可以知道它所存储的数据的意义。

Attribute的名字由a-z,0-9以及其他少量的字母构成,名字的第一个字符必须是字母,空格、下划线及一些特殊字符是不允许出现在Attribute的名字中的。

(2)描述: 是一个描述Attribute的用途的注释。

(3)对象标识符(Object Identifiers)

对象标识符(OID)是被LDAP内部数据库引用的数字。Attribute的名字是让你和我看的,但计算机不喜欢,因为计算机处理数字是最有效率的。如果你对DNS的概念很熟悉的话,那么你应该很容易理解这点。比如:www.sendmail.net 这个域名被计算机接收后会翻译成一个IP地址。

(4)语法(syntax):创建Attribute时要遵从的一些规则,例如只能为数字,只能是电话号码等。语法也可以自己定义。



三、了解了基本知识点就可修改。

新建一个virtualaccount属性,如下

# ifactivated
attributetype ( 2.16.840.1.153730.3.2.14
	NAME virtualaccount	
        DESC 'is or not virtualaccount'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

 给people属性添加此属性

# GalaxyPeople
objectclass	( 2.16.840.1.153730.3.2.22
    NAME 'GalaxyPeople'
	DESC 'GalaxyPeople use to manage people'
    SUP InetOrgPerson
    STRUCTURAL
	MAY (
		otherDepartmentNumber  $ sortid   $  ifactivated  $  peopleLevel $ leadermember $ leaderFilter $ title $ post $ globalsortid $ virtualaccount
	    )
	) 
	  

 

结果:添加完之后,ldap启动不了,不知道为什么??
后来,找到一个别的版本的ldap,将新建virtualaccount属性改为下面的代码

#virtualaccount
attributetype ( 2.16.840.1.153730.3.2.20
	NAME 'virtualaccount'
	DESC 'whether is virtual account or not'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 
	SINGLE-VALUE)	

 

ldap 启动正常,问题解决

 

目前想不通的地方,为什么我的定义是错误的??错在什么地方?ID??属性的ID只要不唯一就可以么??

 

 

你可能感兴趣的:(设计模式,工作,.net,配置管理,项目管理)