Schema是LDAP的一個重要組成部分,類似於數據庫的模式定義,LDAP的Schema定義了LDAP目錄所應遵循的結構和規則,比如一個 objectclass會有哪些屬性,這些屬性又是什么結構等等,schema給LDAP服務器提供了LDAP目錄中類別,屬性等信息的識別方式,讓這些 可以被LDAP服務器識別。
在LDAP的schema中,有四個重要的元素:
1. Objectclass
objectclass定義了一個類別,這個類別會被不同的目錄(在LDAP中就是一個Entry)用到,它說明了該目錄應該有哪些屬性,哪些屬性是必須 的,哪些又是可選的。一個objectclass的定義包括名稱(NAME),說明(DESC),類型(STRUCTURAL或AUXILARY ,表示是結構型的還是輔助型的),必須屬性(MUST),可選屬性(MAY)等信息。
2. Attribute
attribute就是一個上面objectclass中可能包含的屬性,對其的定義包括名稱,數據類型,單值還是多值以及匹配規則等。后面用具體的例子來說明。
3. Syntax
syntax是LDAP中的“語法”,其實就是LDAP中會用到的數據類型和數據約束,這個語法是遵從X.500中數據約束的定義的。其定義需要有一個ID(遵從X.500)以及說明(DESP)
4. Matching Rules
是用來指定某屬性的匹配規則,實際上就是定義一個特殊的Syntax的別名,讓LDAP服務器可以識別,並對定義的屬性進行匹配。
LDAP的schema的主要元素就是這些了,下面列舉出了一些LDAP規定好的或是現在比較通用的schema,一般的LDAP服務器都應該可以識別這些定義。
這就是一個名為subschema的objectclass的定義:
(2.5.20.1 NAME 'subschema' AUXILIARY
MAY ( dITStructureRules $ nameForms $ ditContentRules $
objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )
首先是ID,這里是2.5.20.1,接着是NAME,AUXILIARY說明是輔助型,之后是可選屬性的定義,subschema中沒有定義必須屬性,如果需要定義,應該和MAY一樣,將屬性放在MUST()中並用$隔開
再來看一個屬性定義:
( 2.5.4.3 NAME 'cn' SUP name EQUALITY caseIgnoreMatch )
可以看到cn屬性的父屬性是name,它相等性匹配於caseIgnoreMatch(匹配原則為EQUALITY,還有如SUBSTR是字符串匹配,ORDERING是順序匹配)
syntax定義一般都比較簡單,如:
( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'String' )
這個定義說明,這一串數字1.3.6.1.4.1.1466.115.121.1.5就代表了LDAP中的字符串,這個數字串的定義和X.500相關,包括了它的存儲方式,所占空間大小等。
最后看看Matching Rule的例子,前面提到了caseIgnoreMatch,就看他的吧
( 2.5.13.2 NAME 'caseIgnoreMatch'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
其實1.3.6.1.4.1.1466.115.121.1.15 就是LDAP數據類型Directory String的ID,說明前面的cn需要等於這個數據類型才有效。
還有很多常用schema的定義都在了RFC2252中,LDAP服務器都應該支持這些基本的schema。好了,現在基本對LDAP中的schema有個一個大致的說明,可能有不到位或不妥之處,還望大家指正。
schema類似關系數據庫的字段說明,包括字段名,數據類型,數據長度等等。系統有一些默認的schema,我的默認schema文件
在/usr/local/openldap/etc/openldap/schema下面,最重要的是core.schema。它定義了一些最基本的字段。
為了適應我們的應用,我們要創建自己的schema文件。我創建的shema文件如下:(文件名:kunmail.schema)
#
# kunmail-ldap v3 directory schema
#
# written by MSN:zhoujianguo_leo@hotmail.com
#
# Attribute Type Definitions
attributetype ( 1.3.6.1.4.1.7914.1.2.1.1 NAME 'username'
DESC 'name of the user on the mailsystem'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.2 NAME 'vuid'
DESC 'UID of the user on the mailsystem'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.3 NAME 'vgid'
DESC 'GID of the user on the mailsystem'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.4 NAME 'maildir'
DESC 'Path to the maildir/mbox on the mail system'
EQUALITY caseExactMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.5 NAME 'forwardAddr'
SUBSTR caseIgnoreSubstringsMatch
DESC 'Forward mail address'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'quota'
DESC 'The amount of space the user can use until all further messages get bounced.'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.7 NAME 'storeHost'
DESC 'On which kunmail server the messagestore of this user is located.'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.8 NAME 'delivery'
DESC 'Program to execute for all incoming mails.'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.9 NAME 'clearpw'
DESC 'name of the user on the mailsystem'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.10 NAME 'home'
DESC 'Program to execute for all incoming mails.'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.11 NAME 'mailReplyText'
DESC 'A reply text for every incoming message'
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{4096}
SINGLE-value )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.12 NAME 'active'
DESC 'The status of a user account: active, nopop, disabled'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value )
# Object Class Definitions
objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'kunmailUser'
DESC 'KunMail-LDAP User' SUP top STRUCTURAL
MUST ( username $ cn $ vuid $ vgid )
MAY ( maildir $ home $ clearpw $
forwardAddr $ quota $
storeHost $ delivery $
mailReplyText $ active ) )
現在來說說這個schema文件。
開始部分是attributeType的定義,相當於字段定義。最后的objectclass是定義數據所包含的屬性。
這里kunmailUser這種數據,要包含maildir $ home $ clearpw $ forwardAddr $ quota $ storeHost $ delivery $ mailReplyText $ active
等可選項,還要包括username $ cn $ vuid $ vgid 必選項。 可選項用MAY()來包含,必選項用MUST()來包含。DESC是說明項。SUP表示父類(
有點像面向對象編程啊)top表示沒有父類,他自己是頂級。STRUCTURAL是存儲方式,不管他(我也說不清楚)
接下來解釋attributeType的說明項。
第一個數字是表示序號,至少我是怎么認為的,也許不對,不過。。。管他。
NAME是表示屬性的名字
DESC是說明
下面表示的是匹配的方式,SUBSTR是字符串匹配,EQUALITY是相等性匹配,這些在openldap的admin guide里面有,不難看懂
SYNTAX是表示字段的數據類型。這個admin guide里面也有說明。
SINGLE-value表示這個屬性只有一個值,有些屬性可以有多個值,比如聯系地址等。默認的話,是多值的。
schema准備好之后,我們要在配置文件中,把這個schema包含進去,讓這個schema生效。
在配置文件slapd.conf中間的開始部分加入這樣的一句:
include /usr/local/openldap/etc/openldap/schema/kunmail.schema
應該注意,上面這句話之前應確保有一句:
include /usr/local/openldap/etc/openldap/schema/core.schema
因為kunmail.schema里面有些東西是依賴core.schema的。