Понимание схем в LDAP является очень важным для построения промышленных решений. При всей простоте схем невозможно их объяснить простыми словами, или теряется смысл, или ситуация становится еще более запутанной.
В этой статье я попытаюсь объяснить что такое схема с точки зрения объектно-ориентированно программирования. Если вы не программист, то эта статья вряд ли прояснит для вас ситуацию, но в будущем я постараюсь написать статью на эту тему с использованием других аналогий.
Прежде чем погружаться в дебри синтаксиса ASN.1, попробуем разобраться в объектной модели данных. Главное и наиболее заметное отличие от привычного ООП проявляется при создании экземпляра объекта. Именно в этот момент происходит множественное наследование. Например такой LDIF:
соответствует следующему мифическому коду на C++:
objectClass соответствует понятию класса в ООП, экземпляр объекта получается с использованием анонимного класса с множественным наследованием. Файл схемы соответствует заголовочному файлу.
Обязательным(структурным) классом для экземпляра объекта dc=example,dc=com является organization, а dcObject является вспомогательным. Два класса нам дают два обязательных атрибута для заполнения при инициализации: dc и o. Атрибут description является необязательным. Зная это, перепишем наш C++ псевдокод:
В следующей части этой статьи мы рассмотрим атрибуты.
В этой статье я попытаюсь объяснить что такое схема с точки зрения объектно-ориентированно программирования. Если вы не программист, то эта статья вряд ли прояснит для вас ситуацию, но в будущем я постараюсь написать статью на эту тему с использованием других аналогий.
Получение экземпляра объекта
Прежде чем погружаться в дебри синтаксиса ASN.1, попробуем разобраться в объектной модели данных. Главное и наиболее заметное отличие от привычного ООП проявляется при создании экземпляра объекта. Именно в этот момент происходит множественное наследование. Например такой LDIF:
dn: dc=example,dc=com objectClass: dcObject objectClass: organization dc: example o: Sample Corporation description: "Sample Corp from Neverland"
соответствует следующему мифическому коду на C++:
dcObject,organization *example = new dcObject(), organization(); example->dc = "example"; example->o = "Sample Corporation"; example->description = "Sample Corp from Neverland";
objectClass соответствует понятию класса в ООП, экземпляр объекта получается с использованием анонимного класса с множественным наследованием. Файл схемы соответствует заголовочному файлу.
Описание класса
Синтаксис описания класса:
ObjectClass = "("
OID класса
[ "NAME" имя класса ]
[ "DESC" описание ]
[ "SUP" класс-предок (при наследовании) ]
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) ]
[ "MUST" (OIDs атрибута(-ов)) ]
[ "MAY" (OIDs атрибута(-ов)) ]
")"
Единственный обязательный параметр - уникальный OID. Как получить базовый идентификатор для экспериментов со схемами я описал в этой статье. Рассмотрим остальные поля:- NAME - имя класса, является символьным эквивалентом OID
- DESC - описание класса, помогает разобраться с его предназначением при чтении схемы человеком
- SUP - OID или имя класса, от которого наследуется данный класс. При наследовании в новом классе доступны все атрибуты класса-предка.
- тип класса является обязательным, но имеет значение по умолчанию: STRUCTURAL.
- ABSTRACT - абстрактный класс, может использоваться для создания производных классов.
- AUXILIARY - вспомогательный класс. При создании экземпляра объекта он может наследовать любое количество вспомогательных классов
- STRUCTURAL - структурный класс. Каждый экземпляр объекта должен быть унаследовано от одного(и только одного!!!) структурного класса.
- MUST - список обязательных атрибутов. Атрибуты задаются в круглых скобках в виде OID или имен, разделенных символом $. При создании экземпляра объекта все обязательные поля должны быть заполнены.
- MAY - список необязательных атрибутов.Атрибуты задаются в круглых скобках в виде OID или имен, разделенных символом $.
Посмотрим как в схеме описаны классы, использованные для нашего LDIF:
objectclass ( 1.3.6.1.4.1.1466.344 NAME 'dcObject'
DESC 'RFC2247: domain component object'
SUP top AUXILIARY MUST dc )
objectclass ( 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 ) )
Обязательным(структурным) классом для экземпляра объекта dc=example,dc=com является organization, а dcObject является вспомогательным. Два класса нам дают два обязательных атрибута для заполнения при инициализации: dc и o. Атрибут description является необязательным. Зная это, перепишем наш C++ псевдокод:
dcObject,organization *example = new dcObject("example"), organization("Sample Corporation");
example->description = "Sample Corp from Neverland";
В следующей части этой статьи мы рассмотрим атрибуты.
Комментариев нет:
Отправить комментарий