Harici Rol Eşleme

Edge for Private Cloud v. 4.17.05

Harici Rol Eşleme, kendi gruplarınızı veya rollerinizi Apigee Edge'de oluşturulan rol tabanlı erişim denetimi (RBAC) rolleri ve gruplarıyla eşleştirmenizi sağlar. 

Ön koşullar

  • Bu yapılandırmayı gerçekleştirmek için global sistem yöneticisi kimlik bilgilerine sahip bir Apigee Private Cloud sistem yöneticisi olmanız gerekir. 
  • Apigee Edge Private Cloud kurulumunuzun kök dizinini bilmeniz gerekir. Varsayılan kök dizin /opt. Apigee Edge Private Cloud kurulumu sırasında farklı bir kök dizin seçtiyseniz bu talimatları uygularken /opt yerine o dizini kullanın.
  • Gerekli JAR dosyalarını Apigee'den edinin.

Kullanıcıların Edge'e ve dizin hizmetinize kayıtlı olduğundan emin olun

Rol eşlemesi kullanılırken, Edge'e erişen tüm kullanıcıların hem harici dizin hizmetinizde hem de Edge kullanıcı deposunda bulunması gerekir. Bu nedenle, harici dizin hizmetinize bir kullanıcı eklediğinizde aynı kullanıcıyı Apigee kullanıcı havuzuna da eklemeniz gerekir.

Örneğin, a01@sirket.com adlı bir kullanıcı, "apiadmin" adlı harici dizin grubunuzda bulunuyor. Ardından, a01@sirket.com kullanıcısını Edge'de kuruluş yöneticisi rolüne eşlemek istiyorsunuz. Bu nedenle, a01@sirket.com adlı kullanıcının öncelikle Edge'deki orgadmin grubuna eklenmesi gerekir. 

Edge kullanıcıları oluşturma ve bu kullanıcıları rollere atama hakkında daha fazla bilgi için Genel kullanıcılar oluşturma başlıklı makaleye bakın.

Varsayılan yapılandırma

Harici rol eşleme varsayılan olarak devre dışıdır.

Harici Rol Eşlemeyi Etkinleştirme

  1. Aşağıdaki yapılandırmayı tamamlayabilmeniz için, ExternalRoleMapperService arayüzünü uygulayan bir Java sınıfı oluşturmalısınız. Bu uygulamayla ilgili ayrıntılar için aşağıdaki örnek uygulamaya bakın.
  2. Apigee Edge Yönetim Sunucunuza giriş yapın ve ardından Yönetim Sunucusu'nu durdurun:
    > /opt/../..//../../-service/bin/Apigee-service Edge-management-server stop
  3. Sunucuların durumunu kontrol edin. Yönetim Sunucusu'nun durdurulduğundan/çalıştığından emin olun:
    > /opt/../..//Apigee-service/bin/Apigee-all durumu
  4. Bir metin düzenleyicide /opt/apigee/customer/application/management-server.properties dosyasını açın.
  5. management-server.properties dosyasını aşağıdaki ayarlarla düzenleyin:
    conf_security_authentication.user.store=externalized.authentication
    conf_security_externalized.authentication.role.mapper.enabled=true
    conf_security_externalized.authentication.role.mapper.application.class=com.customer.authorization.impl.an sınıf.


    Bu sınıfı uygulamayla ilgili ayrıntılar için aşağıdaki örnek uygulamaya bakın. 
  6. management-server.properties dosyasını kaydedin.
  7. Yönetim Sunucusu'nu başlatın:
    > /opt/../..//Apigee-service/bin/Apigee-service Edge-management-server start
  8. Sunucunun çalıştığını doğrulayın:
    > /opt/Apigee/Apigee-service/bin/Apigee-all durum

Harici Yetkilendirmeyi Devre Dışı Bırakma

Harici yetkilendirmeyi devre dışı bırakmak için:

  1. Bir metin düzenleyicide /opt/apigee/customer/application/management-server.properties dosyasını açın.
  2. Kimlik doğrulama kullanıcı deposunu ldap olarak değiştirin:
    conf_security_authentication.user.store=ldap
  3. Şu özelliği "false" (yanlış) olarak ayarlayın:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Yönetim Sunucusu'nu yeniden başlatın:
    > /opt/../..//Apigee-service/bin/Apigee-service kenar-management-server yeniden başlatma

ExternalRoleMapperImpl örnek uygulaması hakkında

Yukarıda açıklanan management-server.properties yapılandırma dosyasında şu satıra dikkat edin:

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

Bu sınıf, ExternalRoleMapperService arayüzünü uygular ve zorunludur. Bu sınıf için, ilgili gruplarınızı yansıtan kendi uygulamanızı oluşturmanız gerekir. İşlem tamamlandığında, derlenen sınıfı bir JAR'ye yerleştirin ve bu JAR'yi /<install_dir>/apigee/edge-gateway/lib/infra/libraries konumuna yerleştirin. 

ExternalRoleMapperService hizmetini uyguladığı, sınıf yolunuzdan erişilebilir olduğu ve management-server.properties yapılandırma dosyasında doğru bir şekilde başvuruda bulunulan sürece, sınıfı ve paketi istediğiniz gibi adlandırabilirsiniz. 

Aşağıda, ExternalRoleMapperImpl sınıfının iyi yorumlar yapılmış bir uygulaması verilmiştir. Bu sınıfı derlemek için Edge'de yer alan aşağıdaki JAR dosyasına başvurmanız gerekir:

/<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);

        }

    }

}