Правила LDAP

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Правила LDAP позволяют:

  • Аутентификация. Учетные данные пользователя, указанные в запросе, проверяются на соответствие учетным данным в поставщике LDAP. Правило LDAP предоставляет большую гибкость при аутентификации, позволяя использовать любое значение уникального имени вместе с паролем, даже если это значение уникального имени отсутствует в запросе. Например, вам нужно использовать для аутентификации адрес электронной почты и пароль. Возможны следующие варианты:
    • Если адрес электронной почты указан в запросе, вы можете использовать его вместе с паролем для аутентификации LDAP.
    • Если в запросе нет адреса электронной почты, но есть другой атрибут DN (например, номер телефона), вы можете использовать номер телефона, чтобы получить соответствующий адрес электронной почты из LDAP, а затем использовать адрес электронной почты и пароль для аутентификации.
  • Поиск по уникальному имени (DN). Помимо аутентификации, вы можете использовать правила LDAP, чтобы определить атрибут пользователя в запросе, например адрес электронной почты, и выполнить запрос, который извлекает другие атрибуты DN из LDAP для этого пользователя. Извлеченное различающееся имя сохраняется в переменной.

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

Например, вы можете настроить выполнение вызова API только после успешной аутентификации пользователя в LDAP, а затем при необходимости получить атрибуты DN (доменного имени) для пользователя после успешной аутентификации.

Дополнительная информация:

Примеры

Аутентификация с помощью имени пользователя и пароля

<Ldap name="4GLdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <UserName ref="request.header.username"/>
       <Password ref="request.header.password"/>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

В этом примере показано, как выполнить аутентификацию с помощью поставщика LDAP. Правило передает имя пользователя и пароль из запроса в LDAP для аутентификации.

Аутентификация атрибута уникального имени

<Ldap name="LdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <Password ref="request.header.password"/>
       <SearchQuery>mail={request.header.mail}</SearchQuery>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

Это правило получает различающееся имя пользователя с адресом электронной почты в заголовке запроса, а затем выполняет аутентификацию пользователя в LDAP с помощью пароля, указанного в заголовке запроса.

Поиск в LDAP

<Ldap name="LdapPolicy">
    <!-- using a custom LDAP provider -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
    <LdapResource>MyLdap</LdapResource>
    <Search>
        <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
        <SearchQuery>mail={request.header.mail}</SearchQuery>
        <Attributes>
            <Attribute>address</Attribute>
            <Attribute>phone</Attribute>
            <Attribute>title</Attribute>
        </Attributes>
        <Scope></Scope> <!-- default is ‘subtree’ -->
    </Search>
</Ldap>

Это правило ссылается на поставщика LDAP. Он использует адрес электронной почты в заголовке запроса, чтобы идентифицировать пользователя, а затем извлекает адрес, номер телефона и должность пользователя из LDAP. Извлеченные атрибуты DN сохраняются в переменной. Подробнее о "Переменных, относящихся к правилам"…

Чтобы выполнить поиск в LDAP и получить атрибуты уникальных имен, запрос должен содержать учетные данные администратора.

Сведения об элементах

Ниже приведены описания элементов и атрибутов правил LDAP.

Элемент

Описание

Ldap

Родительский элемент с атрибутом name, в который нужно ввести название правила.

LdapConnectorClass

При использовании правила LDAP с настраиваемым поставщиком LDAP (не от Apigee) укажите полное имя класса коннектора LDAP. Это класс, в котором вы реализовали интерфейс ExternalLdapConProvider от Apigee.

LdapResource

Введите название среды ресурса LDAP. Подробнее о том, как создать ресурс LDAP…

BaseDN

Базовый уровень LDAP, на котором хранятся все ваши данные. Например, в поставщике LDAP Apigee все данные находятся в разделе dc=apigee,dc=com.

  • ref – используется для указания переменной потока, содержащей значение BaseDN, например apigee.baseDN. ref имеет приоритет над явным значением BaseDN. Если вы укажете и ref, и value, приоритет будет иметь ref. Если во время выполнения не удается разрешить ссылку, используется значение.

Scope

  • object – аутентификация или поиск выполняется только на базовом уровне LDAP.
  • onelevel – аутентификация или поиск выполняется на один уровень ниже базового.
  • subtree (поддерево) – значение по умолчанию. Аутентификация или поиск выполняется на базовом уровне и рекурсивно на всех уровнях ниже.

Аутентификация

Authentication

Родительский элемент для реализованной вами процедуры аутентификации.

UserName

Пустой элемент, который принимает один из следующих атрибутов:

  • ref – ссылка на имя пользователя в запросе, например: request.header.username
  • value – имя пользователя.

Если вы не выполняете аутентификацию с помощью имени пользователя или если имя пользователя не включено в запрос, этот элемент добавлять не нужно.

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

Password

Пустой элемент, который принимает один из следующих атрибутов:

  • ref – ссылка на пароль в запросе, например: request.header.password
  • value – зашифрованный пароль.

SearchQuery

Если вы хотите выполнять аутентификацию с помощью атрибута DN, отличного от имени пользователя, например адреса электронной почты, настройте правила LDAP так, чтобы атрибут DN извлекался из запроса (например, имени пользователя), который используется для идентификации пользователя в LDAP, получения адреса электронной почты и аутентификации пользователя.

Например, если в LDAP для хранения адресов электронной почты используется атрибут "mail",

<SearchQuery>mail={request.header.mail}</SearchQuery>

Поиск

Search

Родительский элемент для реализованного вами поискового поведения.

SearchQuery

Определив пользователя с помощью метаданных в запросе или ответе, вы можете использовать этот элемент, чтобы получить дополнительные атрибуты различающегося имени для пользователя из LDAP. Например, если запрос содержит адрес электронной почты пользователя, а в LDAP для хранения адресов электронной почты пользователей определен атрибут mail, вы можете использовать следующие настройки:

<SearchQuery>mail={request.header.mail}</SearchQuery>

Этот запрос ищет в LDAP адрес электронной почты, соответствующий адресу в запросе, и теперь правило может извлекать дополнительные атрибуты уникального имени для этого пользователя с помощью элемента Attributes.

Attributes

Используйте один или несколько элементов <Attribute>, чтобы указать метаданные DN, которые нужно получить для пользователя. Требуется указать хотя бы один атрибут.

Например, после того как SearchQuery идентифицирует пользователя, правило может получить атрибуты DN для пользователя, такие как адрес, номер телефона и должность пользователя, как показано в следующем примере.

Значения атрибутов – это названия атрибутов DN, определенные в LDAP.

<Attributes>
  <Attribute>address</Attribute>
  <Attribute>phone</Attribute>
  <Attribute>title</Attribute>
</Attributes>

Примечания

Apigee Edge для частного облака позволяет использовать поставщика LDAP в вызовах API. С помощью правила LDAP приложения могут аутентифицировать учетные данные пользователей, хранящиеся в LDAP, а вы можете получать уникальные имена (DN) из LDAP – метаданные или атрибуты, связанные с каждым пользователем, например адрес электронной почты, адрес и номер телефона. Возвращенное различающееся имя хранится в переменной для дальнейшего использования прокси-сервером API.

Как создать ресурс LDAP

В политике LDAP используется ресурс LDAP, созданный в Apigee Edge. Ресурс LDAP содержит информацию о подключении к репозиторию LDAP.

Чтобы создать ресурсы LDAP и управлять ими, используйте следующие API и полезную нагрузку:

API

Чтобы создать ресурс LDAP (POST) или получить список всех ресурсов LDAP (GET), выполните следующие действия:

/v1/organizations/org_name/environments/environment/ldapresources

Чтобы получить подробную информацию о ресурсе LDAP, обновить его или удалить, нажмите на значок "Подробности" (GET), "Обновить" (POST) или "Удалить" (DELETE).

/v1/organizations/org_name/environments/environment/ldapresources/ldap_resource_name

Полезная нагрузка

Ниже приведен пример полезной нагрузки XML с комментариями по использованию.

<LdapResource name="ldap1">
  <Connection>
    <Hosts>
      <!-- port is optional: defaults to 389 for ldap:// and 636 for ldaps:// -->
      <Host port="636">foo.com</Host>
    </Hosts>
    <SSLEnabled>false</SSLEnabled> <!-- optional, defaults to false -->
    <Version>3</Version> <!-- optional, defaults to 3-->
    <Authentication>simple</Authentication> <!-- optional, only simple supported -->
    <ConnectionProvider>jndi|unboundid</ConnectionProvider> <!-- required -->
    <ServerSetType>single|round robin|failover</ServerSetType> <!-- not applicable for jndi -->
    <!-- If using a custom LDAP provider, the fully qualified class: -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
  </Connection>
  <ConnectPool enabled="true"> <!-- enabled is optional, defaults to true -->
    <Timeout>30000</Timeout> <!-- optional, in milliseconds; if not set, no timeout -->
    <Maxsize>50</Maxsize> <!-- optional; if not set, no max connections -->
    <Prefsize>30</Prefsize> <!-- optional; if not set, no pref size -->
    <Initsize></Initsize> <!-- optional; if not set, defaults to 1 -->
    <Protocol></Protocol> <!-- optional; if not set, defaults to 'ssl plain' -->
  </ConnectPool>
  <Admin>
    <DN>cn=manager,dc=apigee,dc=com</DN>
    <Password>secret</Password>
  </Admin>
</LdapResource>

Пример curl: создание ресурса LDAP

В следующем примере создается ресурс LDAP с именем ldap1.

curl -X POST -H "Content-Type: application/xml" \
  https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/ldapresources \
  -u apigee_email:password -d \
  '<LdapResource name="ldap1">
    <Connection>
      <Hosts>
      <Host>foo.com</Host>
      </Hosts>
      <SSLEnabled>false</SSLEnabled>
      <Version>3</Version>
      <Authentication>simple</Authentication>
      <ConnectionProvider>unboundid</ConnectionProvider>
      <ServerSetType>round robin</ServerSetType>
    </Connection>
    <ConnectPool enabled="true">
      <Timeout>30000</Timeout>
      <Maxsize>50</Maxsize>
      <Prefsize>30</Prefsize>
      <Initsize></Initsize>
      <Protocol></Protocol>
    </ConnectPool>
    <Admin>
      <DN>cn=manager,dc=apigee,dc=com</DN>
      <Password>secret</Password>
    </Admin>
  </LdapResource>'

Коды ответов

Ниже приведены коды ответов HTML, которые возвращаются при успешном или неудачном выполнении правил:

  • Успех: 200.
  • Сбой: 401

Как использовать собственный поставщик LDAP в Edge для частного облака

Как использовать собственного поставщика LDAP

Apigee Edge для частного облака поставляется с поставщиком LDAP, который уже настроен на взаимодействие с правилами LDAP. Однако если вы используете настраиваемого поставщика LDAP, вам необходимо включить поддержку правила LDAP для него. Вот как это сделать:

  1. В классе поставщика LDAP реализуйте интерфейс ExternalLdapConProvider.
    public interface ExternalLdapConProvider {
      void doAuthentication(LdapBean LlapBean, String userDN, String password, String baseDN);
    
      void doSearchAndAuthentication(LdapBean LlapBean, String password, String baseDN, String query, int scope);
    
      Collection<Map<String, String[]>> doSearch(LdapBean LlapBean, String query,
        String baseDN, Collection<String> requiredAttributes, int scope);
    
      void closeConnections();
    }
  2. В <LdapConnectorClass> конфигурации правил (см. следующие разделы) добавьте полное имя класса специального поставщика LDAP.
  3. Скачайте файл custom-ldap.jar_.zip. (Возможно, вам потребуется нажать правой кнопкой мыши и выбрать Сохранить как.)
  4. Распакуйте его.
  5. Добавьте файл custom-ldap.jar в среду и убедитесь, что он находится в пути к классам.
  6. Создайте ресурс среды для поставщика LDAP. Название ресурса среды будет использоваться в элементе <LdapResource> правила LDAP.

Использование UnboundID LDAP SDK для Java

Вы можете использовать UnboundID LDAP SDK с правилом LDAP, но сначала вам нужно скачать версию 2.3.1 и добавить ее в каждый путь к классам обработчика сообщений.

Чтобы использовать UnboundID LDAP SDK с правилами LDAP:

  1. Откройте браузер и перейдите в репозиторий файлов Sourceforge для UnboundID LDAP SDK:
    https://sourceforge.net/projects/ldap-sdk/files/
  2. Найдите версию 2.3.1 (SE или Standard Edition) SDK и скачайте ZIP-файл для этой версии. Например, скачайте файл unboundid-ldapsdk-2.3.1-se.zip.
  3. Извлеките JAR-файл из ZIP-файла SDK, как показано в следующем примере:
    unzip -j -d ~/tmp ~/Downloads/unboundid-ldapsdk-2.3.1-se.zip unboundid-ldapsdk-2.3.1-se/unboundid-ldapsdk-se.jar

    Эта команда извлекает только JAR-файл в каталог ~/tmp. Она удаляет структуру каталогов с помощью -j, хотя это необязательно.

  4. На каждом узле Message Processor:
    1. Скопируйте JAR-файл в каталог /opt/apigee/edge-gateway/lib/thirdparty процессора сообщений.
    2. При необходимости предоставьте пользователю Apigee разрешение на доступ к JAR-файлу, чтобы процессор сообщений мог его использовать.
    3. Edge добавляет все сторонние библиотеки в каталоге /opt/apigee/edge-gateway/lib/thirdparty в путь к классам.

    4. Перезапустите Message Processor:
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

Переменные процесса

Ниже перечислены переменные правил LDAP, заполняемые SearchQuery.

Переменная

Описание

ldap.policyName.execution.success

После выполнения правила эта переменная потока содержит значение "true" или "false" в зависимости от результата.

ldap.policyName.search.result[index].
  attribute.attrName[index]=value

Гибкий формат этой переменной, в частности индекс, позволяет учитывать несколько атрибутов, а также атрибуты с несколькими значениями. Индекс – это число, начинающееся с 1. Если номер индекса не указан, по умолчанию используется значение 1.

Если правило возвращает адрес, номер телефона и адрес электронной почты, вы можете получить первый атрибут и значение, используя следующие переменные:

ldap.policyName.search.result.attribute.address
ldap.policyName.search.result.attribute.phone
ldap.policyName.search.result.attribute.email

Если вы хотите получить третий атрибут адреса в результатах поиска, используйте следующий код:

ldap.policyName.search.result[3].attribute.address

Если у атрибута несколько значений (например, у пользователя несколько адресов электронной почты), второй адрес можно получить следующим образом:

ldap.policyName.search.result.attribute.mail[2]

Коды ошибок

Ошибки, возвращаемые правилами Edge, имеют единый формат, описанный в справочнике кодов ошибок.

Эта политика использует следующие коды ошибок:

Код ошибки Сообщение
InvalidAttributeName Invalid attribute name {0}.
InvalidSearchBase Search base can not be empty.
InvalidValueForPassword Invalid value for password field. It can not be empty.
InvalidSearchScope Invalid scope {0}. Allowed scopes are {1}.
InvalidUserCredentials Invalid user credentials.
InvalidExternalLdapReference Invalid external ldap reference {0}.
LdapResourceNotFound Ldap resource {0} not found.
BaseDNRequired Base DN required.
OnlyReferenceOrValueIsAllowed Only value or reference is allowed for {0}.
AttributesRequired At least one attribute required for search action.
UserNameIsNull User name is null.
SearchQueryAndUserNameCannotBePresent Both search query and username can not be present in the authentication action. Please specify either one of them.