このほか、オブジェクトクラスには継承という概念があります。構造型のオブジェクトクラスとして「account」オブジェクトクラスではなく、例えばinetorgperson.schemaファイルに用意された「inetOrgPerson」オブジェクトクラスを追加することを選択した場合、ユーザーエントリには、「account」オブジェクトクラスを選択した場合のエントリと比較し、「sn」属性が追加で必要になります。
次のLDIFファイルは、inetOrgPersonオブジェクトクラスを利用する場合に必要となる定義を行った例です。
# less sample_2.ldif
dn: uid=test2,ou=People,dc=my-domain,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: test2
cn: test2
sn: test2
uidNumber:5002
gidNumber:5002
homeDirectory: /home/test2
userPassword: password
...[略] |
これは、「inetOrgPerson」オブジェクトクラスが「organizationalPerson」オブジェクトクラスを継承し、さらにその「organizationalPerson」オブジェクトクラスが継承する「person」オブジェクトクラスにおいて、「sn」を必須の属性として定義しているためです。
図1 オブジェクトクラスの継承
# less [OpenLDAPインストールDir]/etc/openldap/schema/inetorgperson.schema
objectclass ( 2.16.840.1.113730.3.2.2
NAME 'inetOrgPerson'
DESC 'RFC2798: Internet Organizational Person'
SUP organizationalPerson
STRUCTURAL
MAY (
...[略]
) |
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
objectclass ( 2.5.6.7 NAME 'organizationalPerson'
→inetOrgPersonはorganizationalPersonを継承
DESC 'RFC2256: an organizational person'
SUP person STRUCTURAL
MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
...[略]
)
objectclass ( 2.5.6.6 NAME 'person'
→organizationalPersonはpersonを継承
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn ) ←personhaはsn、cnを必須属性として持つ
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
...[略]
) |
このように、スキーマを設計する作業においては、LDAPクライアントが必要とする情報を、ディレクトリサーバが扱うデータ型へと落としていくことになりますが、その過程ではオブジェクトクラスの持つ制約にも注意しながら作業を進める必要があります。
オブジェクトクラスに任意属性、必須属性として定義された各属性もそれぞれがオブジェクトIDを持ち、属性値を比較するルール、属性値が取り得る構文(いわゆる型)などが定められています。
例えば、posixAccountオブジェクトクラスに必須属性として定義されたuidNumber属性は、
- オブジェクトIDは、"1.3.6.1.1.1.1.0"
- 等価比較する場合のルール(EQUALITY)は、数値の一致
- 属性値は、数値型(Integer)で構成される(SYNTAX)
- 複数の値は取らない(SINGLE-VALUE)
と定義されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
# Attribute Type Definitions
# builtin
#attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
# DESC 'An integer uniquely identifying a user in an administrative domain'
# EQUALITY integerMatch
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) |
また、同じくposixAccountオブジェクトクラスに必須属性として定義されたhomeDirectory属性は、
- オブジェクトIDは、"1.3.6.1.1.1.1.3"
- 等価比較する場合のルール(EQUALITY)は、大文字/小文字を区別する
- 属性値は、International Alphabet 5(ASCII文字列)で構成される(SYNTAX)
- 複数の値は取らない(SINGLE-VALUE)
と定義されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
attributetype ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory'
DESC 'The absolute path to the home directory'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) |
このような属性の定義を把握することで、対象となる属性にはどのような値の設定が可能か、検索時にはどのような比較が行われ、どのようなタイプのIndexを作成するべきかの判断が容易になります。
このほか、属性もオブジェクトクラスと同様に、上位の属性の持つ性質を継承することができます。例えば、core.schemaファイルで定義される属性cn、snは、属性nameの持つ、
- 等価比較する場合のルール(EQUALITY)は、大文字/小文字を無視する
- 部分文字列を比較する場合のルール(SUBSTR)は、大文字/小文字を無視する
- 属性値は、Directory String(UTF8文字列)で構成され(SYNTAX)32768文字まで
という定義を継承しています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema
# system schema
#attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' )
# DESC 'RFC2256: common name(s) for which the entity is known by'
# SUP name )
attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' )
DESC 'RFC2256: last (family) name(s) for which the entity is known by'
SUP name )
...[略] # system schema
#attributetype ( 2.5.4.41 NAME 'name' ←7行上、3行上から継承
# EQUALITY caseIgnoreMatch
# SUBSTR caseIgnoreSubstringsMatch
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) |
このように、各属性の持つ定義に加え、継承という概念を理解することで、属性の拡張が必要となった場合の作業を容易に進めることができるようになります。