LDAP的Schema


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的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM