четверг, 17 мая 2012 г.

Схемы, объекты, атрибуты. Часть 1

Понимание схем в LDAP является очень важным для построения промышленных решений. При всей простоте схем невозможно их объяснить простыми словами, или теряется смысл, или ситуация становится еще более запутанной.
В этой статье я попытаюсь объяснить что такое схема с точки зрения объектно-ориентированно программирования. Если вы не программист, то эта статья вряд ли прояснит для вас ситуацию, но в будущем я постараюсь написать статью на эту тему с использованием других аналогий.

Получение экземпляра объекта


Прежде чем погружаться в дебри синтаксиса 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";

В следующей части этой статьи мы рассмотрим атрибуты. 

Комментариев нет:

Отправить комментарий