Mapowanie ról zewnętrznych

Edge for Private Cloud wer. 4.17.05

Mapowanie ról zewnętrznych pozwala zmapować własne grupy lub role na role kontroli dostępu opartej na rolach i grupy utworzone w Apigee Edge. 

Wymagania wstępne

  • Aby przeprowadzić tę konfigurację, musisz być administratorem systemu Apigee Private Cloud z globalnymi danymi logowania administratora systemu. 
  • Musisz znać katalog główny instalacji Apigee Edge Private Cloud. Domyślnym katalogiem głównym jest /opt. Jeśli podczas instalacji Apigee Edge Private Cloud wybrano inny katalog główny, użyj go zamiast /opt, wykonując te instrukcje.
  • Uzyskaj wymagane pliki JAR z Apigee.

Sprawdź, czy użytkownicy są zarejestrowani w Edge i usłudze katalogowej

Podczas korzystania z mapowania ról wszyscy użytkownicy z dostępem do Edge muszą istnieć zarówno w zewnętrznej usłudze katalogowej, jak i w repozytorium użytkowników Edge. Oznacza to, że gdy dodajesz użytkownika do zewnętrznej usługi katalogowej, musisz też dodać tego samego użytkownika do repozytorium użytkownika Apigee.

Na przykład użytkownik a01@firma.com istnieje w zewnętrznej grupie katalogu 'apiadmin'. Następnie chcesz zmapować użytkownika a01@firma.com na rolę administrator organizacji w Edge. Dlatego użytkownik a01@firma.com musi najpierw zostać dodany do grupy orgadmin w przeglądarce Edge. 

Więcej informacji o tworzeniu użytkowników Edge i przypisywaniu ich do ról znajdziesz w artykule Tworzenie użytkowników globalnych.

Konfiguracja domyślna

Mapowanie ról zewnętrznych jest domyślnie wyłączone.

Włączanie mapowania ról zewnętrznych

  1. Zanim będzie można dokończyć konfigurację, musisz utworzyć klasę Java, która implementuje interfejs ExternalRoleMapperService. Szczegółowe informacje o tej implementacji znajdziesz w przykładowej implementacji poniżej.
  2. Zaloguj się na serwerze Apigee Edge Management, a następnie zatrzymaj serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server stop
  3. Sprawdź stan serwerów. Upewnij się, że serwer zarządzania jest wstrzymany lub nie:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
  5. Wprowadź zmiany do pliku management-server.properties:
    conf_security_authentication.user.store=externalized.authentication
    conf_security_externalized.authentication.role.mapper.enabled=true
    conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.External, które jest wymagane jako przykładowa klasa_klienta.autoryzacja.impl. Jest to:
    Ważna nazwa pakietu, którą możesz zaimplementować, a której klasa jest:
    Ważna klasa, którą możesz zaimplementować, a której klasa jest: Twoja klasa lub klasa zewnętrzna
    Więcej informacji o implementowaniu tych zajęć znajdziesz w przykładowej implementacji poniżej. 
  6. Zapisz plik management-server.properties.
  7. Uruchom serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server start
  8. Sprawdź, czy serwer działa:
    > /opt/apigee/apigee-service/bin/apigee-all status

Wyłączanie autoryzacji zewnętrznej

Aby wyłączyć autoryzację zewnętrzną:

  1. Otwórz plik /opt/apigee/customer/application/management-server.properties w edytorze tekstu.
  2. Zmień magazyn użytkowników uwierzytelniania na ldap:
    conf_security_authentication.user.store=ldap
  3. Ustaw wartość tej właściwości na false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Ponownie uruchom serwer zarządzania:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server restart

Informacje o przykładowej implementacji ExternalRoleMapperImpl

Zwróć uwagę na ten wiersz w pliku konfiguracyjnym management-server.properties opisanym powyżej:

conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl

Ta klasa implementuje interfejs ExternalRoleMapperService i jest wymagana. Musisz utworzyć własną implementację tych zajęć, która będzie odzwierciedlała Twoje grupy. Gdy skończysz, umieść skompilowaną klasę w pliku JAR i umieść ją w katalogu /<install_dir>/apigee/edge-gateway/lib/infra/libraries

Możesz nadać klasie i pakietowi dowolną nazwę, pod warunkiem że ma ona zaimplementowany interfejs ExternalRoleMapperService, jest dostępny w ścieżce klasy i prawidłowo odwołuje się do niego w pliku konfiguracyjnym management-server.properties

Poniżej znajdziesz dobrze skomentowaną przykładową implementację klasy ExternalRoleMapperImpl. Aby skompilować tę klasę, musisz odwołać się do tego pliku JAR dołączonego do Edge:

/<install_dir>/apigee/edge-gateway/lib/infra/libraries/authentication-1.0.0.jar 
package com.apigee.authenticate;

import com.apigee.authentication.ConfigBean;
import com.apigee.authentication.ConnectionException;
import com.apigee.authentication.ExternalRoleMapperService;
import com.apigee.authentication.NameSpace;
import com.apigee.authentication.NameSpacedRole;
import com.apigee.authorization.namespace.OrganizationNamespace;
import com.apigee.authorization.namespace.SystemNamespace;
import java.util.Collection;
import java.util.HashSet;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

/** * 
 * Sample Implementation constructed with dummy roles with required namespaces.
 * 
 * Created by GopiAlagar on 6/12/15.
 */

public class ExternalRoleMapperImpl implements ExternalRoleMapperService {

    InitialDirContext dirContext = null;

    @Override
    public void stop() throws Exception {
    }

    /**
    * 
    * This method would be implemented by the customer, Below is the basic
    * example. 
    * 
    * If User has sysadmin role then it's expected to set SystemNameSpace 
    * along with the
    * res\quested NameSpace. Otherwise role's requestedNameSpace to be set 
    * for the NameSpacedRole.
    * 
    * Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>();
    * 
    * NameSpacedRole sysNameSpace = new NameSpacedRole("sysadmin",
    * SystemNamespace.get());
    * 
    * String orgName =
    * ((OrganizationNamespace)requestedNameSpace).getOrganization();
    * 
    * NameSpacedRole orgNameSpace = new NameSpacedRole ("orgadmin",
    * requestedNameSpace);
    * 
    * results.add(sysNameSpace);
    * 
    * results.add(orgNameSpace);
    */

public Collection<NameSpacedRole> getUserRoles(String userName,
    String password, NameSpace requestedNameSpace) {

    /*
    * There are 3 actions performed in the below implementation
    * 1. Authenticate Given User against ADS
    * 2. Fetch the internal groups from the ADS
    * 3. Map the internal group into the apigee-edge roles
    */

    /*************************************************************/
    /******************* Authenticate Given User *******************/
    /*************************************************************/

    // Customer Specific Implementation will override this method
    // implementation.

    // Obtain dnName for given username or email address.
    String dnName = ImplementDnameLookupLogic();

    if (dnName == null) {
        System.out.println("Error ");
    }

    DirContext dirContext = null;

    Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>();

    try {

        // Verify the credentials for a given username or dnName 
        // and password in order to create a directory context.
        dirContext = ImplementDirectoryContextCreationLogic();

        /****************************************************/
        /********** Fetch internal groups *******************/
        /****************************************************/

        String groupDN = "OU=Groups,DC=corp,DC=wacapps,DC=net";
        SearchControls controls = new SearchControls();
        controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
        NamingEnumeration<SearchResult> groups = dirContext.search(groupDN,"(objectClass=*)", new Object[] { "", "" }, controls);

        if (groups.hasMoreElements()) {
            while (groups.hasMoreElements()) {
                SearchResult searchResult = groups.nextElement();
                Attributes attributes = searchResult.getAttributes();
                String groupName = attributes.get("name").get().toString();

                 /**************************************/
                 /** Map the internal group into the ***/
                 /** apigee-edge roles               ***/
                 /**************************************/

                if (groupName.equals("BusDev")) {
                    results.add(new NameSpacedRole("businessAdmin",SystemNamespace.get()));

                } else if (groupName.equals("DevSupport")) {
                    results.add(new NameSpacedRole("devOpsAdmin",SystemNamespace.get()));

                } else if (groupName.equals("Engineering")) {
                    if (requestedNameSpace instanceof OrganizationNamespace) {
                        String orgName = ((OrganizationNamespace) requestedNameSpace).getOrganization();
                        results.add(new NameSpacedRole("orgadmin", new OrganizationNamespace(orgName)));
                    }

                } else if (groupName.equals("Operations") || groupName.equals("IT")) {
                    results.add(new NameSpacedRole("sysadmin",SystemNamespace.get()));

                } else if (groupName.equals("Marketing")) {
                    results.add(new NameSpacedRole("marketAdmin",SystemNamespace.get()));

                } else {
                    results.add(new NameSpacedRole("readOnly",SystemNamespace.get()));
                }
            }

        } else {

            /** 
            * In case of no group found or exception found we throw empty
            * roles.
            */
            System.out.println(" !!!!! NO  GROUPS FOUND !!!!!");
        }

    } catch (Exception ex) {
        ex.printStackTrace();
        System.out.println("Error in authenticating User: {}" + new Object[] { userName });

    } finally {
        // Customer implementation to close 
        // ActiveDirectory/LDAP context.
    }

    return results;

}

@Override
public void start(ConfigBean arg0) throws ConnectionException {

    try {
        // Create InitialDirContext.
        // Create a directory context based on the 
        // system admin user credentials.
        dirContext = ImplementDirContextCreationLogicForSysAdmin();

        } catch (NamingException e) {
            // TODO Auto-generated catch block

            throw new ConnectionException(e);

        }

    }

}