Zasada LDAP

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Co

Zasada LDAP zapewnia:

  • Uwierzytelnianie: dane logowania użytkownika podane w żądaniu są sprawdzane pod kątem danych logowania u dostawcy LDAP. Zasada LDAP zapewnia dużą elastyczność w zakresie uwierzytelniania, pozwalając na używanie dowolnej wartości nazwy wyróżniającej wraz z hasłem, nawet jeśli tej wartości wyróżniającej nie ma w żądaniu. Załóżmy na przykład, że do uwierzytelnienia potrzebujesz adresu e-mail lub hasła. Oto dostępne opcje:
    • Jeśli w żądaniu znajduje się adres e-mail, możesz go po prostu użyć z hasłem na potrzeby uwierzytelniania LDAP.
    • Jeśli w żądaniu nie ma adresu e-mail, ale jest inny atrybut DN (np. numer telefonu), możesz użyć numeru telefonu, aby uzyskać odpowiedni adres e-mail z LDAP, a następnie uwierzytelnić się za pomocą adresu e-mail / hasła.
  • Wyszukiwanie nazwy wyróżniającej (DN): oprócz uwierzytelniania przy użyciu zasad LDAP możesz też identyfikować atrybut użytkownika w żądaniu, taki jak adres e-mail, i wykonywać zapytania, które pobierają inne atrybuty DN dla tego użytkownika z LDAP. Pobrana nazwa wyróżniająca jest przechowywana w zmiennej.

Użyj zasady LDAP, gdy dostęp do chronionych zasobów powinien być ograniczony do użytkowników u dostawcy LDAP – takich jak administratorzy, użytkownicy z organizacji lub programiści – zwłaszcza wtedy, gdy dostęp do tokena OAuth jest niepotrzebny lub zbyt duży. Zasada służy też do pobierania metadanych nazwy domeny do użycia w przepływach proxy interfejsów API.

Wywołanie interfejsu API może być na przykład wykonywane tylko po uwierzytelnieniu użytkownika w LDAP i opcjonalnie pobierać atrybuty nazwy domeny użytkownika po pomyślnym uwierzytelnieniu.

Dodatkowe informacje:

Sample

Uwierzytelnianie za pomocą nazwy użytkownika i hasła

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

Ten przykład przedstawia uwierzytelnianie przy użyciu dostawcy LDAP. Zasada przekazuje nazwę użytkownika i hasło z żądania do LDAP w celu uwierzytelnienia.

Uwierzytelnianie atrybutu DN

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

Ta zasada pobiera nazwę wyróżniającą użytkownika z adresem e-mail w nagłówku żądania, a następnie uwierzytelnia użytkownika w LDAP za pomocą hasła podanego w nagłówku żądania.

Przeszukiwanie 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>

Ta zasada odwołuje się do niestandardowego dostawcy LDAP. Zidentyfikuje użytkownika na podstawie adresu e-mail z nagłówka żądania, a następnie pobiera jego adres, numer telefonu i stanowisko z LDAP. Pobrane atrybuty nazwy wyróżniającej są przechowywane w zmiennej. Zobacz „Zmienne związane z zasadami”.

Aby można było przeszukiwać LDAP i pobierać atrybuty nazwy wyróżniającej, żądanie musi zawierać dane logowania administratora.

Odwołanie do elementu

Poniżej znajdziesz opisy elementów i atrybutów zasady LDAP.

Element

Opis

Ldap

Element nadrzędny z atrybutem „name” umożliwiającym wpisanie nazwy zasady.

LdapConnectorClass

Jeśli używasz zasady LDAP z niestandardowym dostawcą LDAP (którym nie jest Apigee), określ w pełni kwalifikowaną klasę oprogramowania sprzęgającego LDAP. To klasa, w której zaimplementowałeś interfejs ExternalLdapConProvider Apigee.

LdapResource

Wpisz nazwę środowiska zasobu LDAP. Więcej informacji znajdziesz w artykule Tworzenie zasobu LDAP.

BaseDN

Podstawowy poziom LDAP, na którym znajdują się wszystkie Twoje dane. Na przykład u dostawcy LDAP Apigee wszystkie dane znajdują się w domenie dc=apigee,dc=com.

  • ref: służy do określania zmiennej przepływu zawierającej wartość BaseDN, np. apigee.baseDN. ref ref ma pierwszeństwo przed jawną wartością BaseDN. Jeśli podasz zarówno wartość referencyjną, jak i wartość, atrybut ref ma priorytet. Jeśli odwołanie nie zostanie rozpoznane w czasie działania, używana jest wartość.

Scope

  • object: uwierzytelnianie lub wyszukiwanie odbywa się tylko na poziomie podstawowym LDAP.
  • onelevel: uwierzytelnianie lub wyszukiwanie odbywa się o jeden poziom poniżej poziomu podstawowego.
  • subtree (domyślnie): uwierzytelnianie lub wyszukiwanie odbywa się na poziomie podstawowym, całkowicie rekurencyjnie poniżej poziomu podstawowego.

Uwierzytelnianie

Authentication

Element nadrzędny implementowanego przez Ciebie sposobu uwierzytelniania.

UserName

Pusty element, który przyjmuje jeden z tych atrybutów:

  • ref: odwołanie do nazwy użytkownika w żądaniu, np. request.header.username
  • wartość: nazwa użytkownika,

Jeśli nie uwierzytelniasz się za pomocą nazwy użytkownika lub jeśli w żądaniu nie podano nazwy użytkownika, nie musisz uwzględniać tego elementu.

Jeśli w żądaniu znajduje się nazwa użytkownika, ale chcesz uwierzytelnić użytkownika przy użyciu atrybutu wyróżniającego innego niż nazwa użytkownika, np. adresu e-mail, dołącz SearchQuery, aby uzyskać adres e-mail użytkownika powiązany z hasłem. Zasada LDAP używa nazwy użytkownika do wysyłania zapytań do dostawcy LDAP o odpowiedni adres e-mail, który jest następnie używany do uwierzytelniania.

Password

Pusty element, który przyjmuje jeden z tych atrybutów:

  • ref: odwołanie do hasła w żądaniu, np. request.header.password
  • value: zaszyfrowane hasło.

SearchQuery

Jeśli chcesz uwierzytelnić się przy użyciu atrybutu wyróżniającego innego niż nazwa użytkownika, takiego jak adres e-mail, skonfiguruj zasady LDAP tak, aby pobierały atrybut nazwy wyróżniającej z żądania (na przykład nazwa użytkownika), który służy do identyfikowania użytkownika w LDAP, pobierania adresu e-mail i uwierzytelniania użytkownika.

Załóżmy, że LDAP zdefiniuje atrybut „mail” do przechowywania adresu e-mail:

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

Wyszukiwarka

Search

Element nadrzędny implementowanego przez Ciebie działania wyszukiwania.

SearchQuery

Zidentyfikując użytkownika za pomocą metadanych w żądaniu lub odpowiedzi, możesz użyć tego elementu, aby pobrać dodatkowe atrybuty nazwy użytkownika z LDAP. Jeśli na przykład żądanie zawiera adres e-mail użytkownika, a LDAP określa atrybut mail do przechowywania adresów e-mail użytkowników, możesz użyć tego ustawienia:

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

To zapytanie wyszukuje w LDAP adres e-mail pasujący do adresu e-mail w żądaniu. Zasada może teraz pobierać dodatkowe atrybuty nazwy użytkownika za pomocą elementu Attributes.

Attributes

Za pomocą co najmniej jednego elementu <Attribute> wskaż metadane nazwy wyróżniającej, które chcesz pobrać dla użytkownika. Wymagany jest co najmniej 1 atrybut.

Na przykład po zidentyfikowaniu użytkownika za pomocą zasady SearchQuery zasada może pobierać atrybuty jego nazwy, takie jak adres, numer telefonu i tytuł użytkownika, jak w tym przykładzie.

Wartości atrybutów to nazwy atrybutów wyróżniających określone w LDAP.

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

Zastosowanie

Apigee Edge dla Private Cloud umożliwia wykorzystanie dostawcy LDAP w wywołaniach interfejsu API. Dzięki zasadom LDAP aplikacje mogą uwierzytelniać dane logowania do użytkowników przechowywanych w LDAP, a także możesz pobierać z usługi LDAP nazwy wyróżniające – metadane lub atrybuty powiązane z każdym użytkownikiem, takie jak adres e-mail, adres i numer telefonu. Zwrócona nazwa wyróżniająca jest przechowywana w zmiennej do dalszego wykorzystania przez serwer proxy interfejsu API.

Tworzenie zasobu LDAP

Zasada LDAP korzysta z zasobu LDAP utworzonego w Apigee Edge. Zasób LDAP udostępnia informacje o połączeniu z repozytorium LDAP.

Aby tworzyć zasoby LDAP i nimi zarządzać, użyj poniższego interfejsu API i ładunku:

API

Utwórz (POST) zasób lub listę LDAP (GET) wszystkich zasobów LDAP:

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

Aby uzyskać szczegółowe informacje o zasobie LDAP (GET), Aktualizacji (POST) i usuwaniu (DELETE):

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

Ładunek

Poniżej znajduje się przykładowy ładunek XML z komentarzami dotyczącymi użycia.

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

Przykład curl: Tworzenie zasobu LDAP

Poniższy przykład umożliwia utworzenie zasobu LDAP o nazwie 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>'

Kody odpowiedzi

Oto kody odpowiedzi HTML, które są zwracane w przypadku powodzenia lub niepowodzenia:

  • Sukces: 200
  • Błąd: 401

Korzystanie z niestandardowego dostawcy LDAP w Edge for Private Cloud

Używanie niestandardowego dostawcy LDAP

Apigee Edge for Private Cloud udostępnia dostawcę LDAP, który został już skonfigurowany pod kątem interakcji z zasadą LDAP. Jeśli jednak używasz niestandardowego dostawcy LDAP, musisz go włączyć, aby obsługiwał zasady LDAP. Aby to zrobić:

  1. W klasie dostawcy LDAP zaimplementuj interfejs 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. W sekcji <LdapConnectorClass> konfiguracji zasad (następne sekcje) dodaj pełną i jednoznaczną nazwę klasy niestandardowego dostawcy LDAP.
  3. Pobierz plik custom-ldap.jar_.zip. (jeśli trzeba, kliknij prawym przyciskiem myszy i wybierz Zapisz jako).
  4. Rozpakuj go.
  5. Dodaj do środowiska plik custom-ldap.jar i sprawdź, czy znajduje się on w ścieżce klasy.
  6. Utwórz zasób środowiska dla dostawcy LDAP. Nazwa zasobu środowiska jest używana w elemencie <LdapResource> zasady LDAP.

Korzystanie z pakietu SDK LDAP UnboundID dla Javy

Możesz używać pakietu SDK LDAP UnboundID z zasadami LDAP, ale najpierw musisz pobrać wersję 2.3.1 i dodać ją do każdej ścieżki klasy procesora wiadomości.

Aby używać pakietu SDK LDAP UnboundID z zasadą LDAP:

  1. Otwórz przeglądarkę i przejdź do repozytorium plików Sourceforge dla pakietu SDK LDAP UnboundID:
    https://sourceforge.net/projects/ldap-sdk/files/
  2. Znajdź pakiet SDK w wersji 2.3.1 (SE lub Standard Edition) i pobierz plik ZIP z tą wersją. Na przykład pobierz plik „unboundid-ldapsdk-2.3.1-se.zip”.
  3. Wyodrębnij plik JAR z pliku ZIP pakietu SDK zgodnie z poniższym przykładem:
    unzip -j -d ~/tmp ~/Downloads/unboundid-ldapsdk-2.3.1-se.zip unboundid-ldapsdk-2.3.1-se/unboundid-ldapsdk-se.jar

    To polecenie wyodrębnia tylko plik JAR do katalogu ~/tmp. Usuwa strukturę katalogu z elementem -j, chociaż jest to opcjonalne.

  4. W każdym węźle procesora wiadomości:
    1. Skopiuj plik JAR do katalogu /opt/apigee/edge-gateway/lib/thirdparty procesora wiadomości.
    2. W razie potrzeby przyznaj użytkownikowi Apigee uprawnienia do pliku JAR, aby procesor wiadomości mógł uzyskać do niego dostęp.
    3. Edge dodaje do ścieżki klasy wszystkie biblioteki zewnętrzne z katalogu /opt/apigee/edge-gateway/lib/thirdparty.

    4. Ponownie uruchom procesor wiadomości:
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

Zmienne przepływu

Poniżej znajdziesz zmienne zasad LDAP wypełnione przez SearchQuery.

Zmienna

Opis

ldap.policyName.execution.success

Po wykonaniu zasady ta zmienna przepływu zawiera wartość „true” lub „false” w zależności od wyniku.

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

Elastyczny format tej zmiennej, a w szczególności indeks: uwzględnia wiele atrybutów oraz atrybuty z wieloma wartościami. Argument indeks jest liczbą rozpoczynającą się od 1. Jeśli nie podasz numeru indeksu, domyślny numer indeksu to 1.

Jeśli zasada zwraca adres, numer telefonu i adres e-mail, możesz pobrać pierwszy atrybut i wartość za pomocą tych zmiennych:

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

Aby pobrać trzeci atrybut adresu z wyników wyszukiwania, możesz użyć tego kodu:

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

Jeśli atrybut ma wiele wartości (np. użytkownik ma kilka adresów e-mail), drugi adres e-mail możesz pobrać z wyników w ten sposób:

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

Kody błędów

Błędy zwracane z zasad Edge mają spójny format opisany w Informacjach na temat kodów błędów.

Ta zasada używa tych kodów błędów:

Kod błędu przekaz,
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.