Harici Rol Eşleme

Edge for Private Cloud 4.18.01 sürümü

Harici Rol Eşleme, kendi gruplarınızı veya rollerinizi rol tabanlı erişim denetimiyle eşleştirmenize olanak tanır. Apigee Edge'de oluşturulan (RBAC) roller ve gruplar. Bu özellik yalnızca Edge Private ile kullanılabilir Cloud'da geliştiricilerin karşılaştığı yaygın sorunları çözmenize ve kullanım alanlarını öğrenmenize yardımcı olacak teknik belgeleri ve videoları keşfedin.

Yenilikler

4.18.01'den önceki Private Cloud sürümleri için Edge'in Harici Rol Eşleme hizmeti desteği sonlandırıldı. Harici rol eşlemenin 4.18.01 sürümü, hataların düzeltildiği güncellenmiş bir sürümdür ve eklenen yeni özellikler:

  • Aşağıdaki durumlarda kimlik doğrulaması 403 yasak yanıtları almanıza neden olan sorun düzeltildi erişimi olması gereken kullanıcılarla kimlik doğrulaması yapmaktır.
  • X-Apigee-Current-User başlığı artık Harici Rol Eşlemede desteklenmektedir. Uygun erişime (sysadmin) sahip kullanıcılar artık şunları yapabilir: başka bir kullanıcıya atanan rolleri görüntüleyebilirsiniz.

Ön koşullar

  • Global sistem yöneticisi bulunan bir Apigee Private Cloud sistem yöneticisi olmanız gerekir kimlik bilgilerinden yararlanın.
  • Apigee Edge Private Cloud yüklemenizin kök dizinini bilmeniz gerekir. İlgili içeriği oluşturmak için kullanılan varsayılan kök dizin /opt'dir.

Adım adım kurulum örneği

Bkz. bu makaleyi Apigee Topluluk Forumları'nda bulabilirsiniz. rol eşlemesi.

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ı tamamlamadan önce ExternalRoleMapperServiceV2 arayüzünü uygular ve uygulamanızı Yönetim Sunucusu sınıf yolu:

    . /opt/apigee/edge-management-server/lib/thirdparty/

    . Bu uygulamayla ilgili ayrıntılar için, bkz. ExternalRoleMapperImpl Hakkında örnek uygulamayı bu dokümanın ilerleyen bölümlerinde bulabilirsiniz.
  2. Apigee Edge yönetim sunucunuza giriş yapıp yönetim sunucusunu durdurun işlem:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server durma
  3. /opt/apigee/customer/application/management-server.properties dosyasını açın. kullanabilirsiniz. Bu dosya mevcut değilse dosyayı oluşturun.
  4. Aşağıdaki ayarları yapmak için özellikler dosyasını düzenleyin:
    # Kullanılacak kullanıcı mağazası kimlik doğrulama.
    . # "externalized.authentication" komutunu kullanın LDAP kullanıcı deposu için kullanılır.
    . # Yetkilendirme için LDAP kullanmaya devam ettiğimizi unutmayın.
    . # Harici kimlik doğrulamayı etkinleştirme hakkında daha fazla bilgi edinin kontrol edin.
    . conf_security_authentication.user.store=externalized.authentication

    . #Harici yetkilendirmeler rol eşleyicisini etkinleştirin.
    . conf_security_externalized.authentication.role.mapper.enabled=true conf_security_externalized.authentication.role.mapper.implementation.class=
    com.customer.authorization.impl.ExternalRoleMapperImpl

    . Önemli:
    yukarıdaki yapılandırmada başvurulan uygulama sınıfı ve paket adı (ExternalRoleMapperImpl) yalnızca örnektir. Uygulamanız gereken bir sınıftır ve sınıfa ad verebilir ve onu istediğiniz gibi paketleyebilirsiniz. Bunu uygulamayla ilgili ayrıntılar için hakkında daha fazla bilgi için Aşağıdaki ExternalRoleMapperImpl örnek uygulama sınıfını inceleyebilirsiniz. Bu sınıfa yansıtmalıdır.
  5. management-server.properties dosyasını kaydedin.
  6. management-server.properties dosyasının sahibi: Apigee kullanıcısı:?
    . > chown Apigee:Apigee /opt/apigee/customer/application/management-server.properties
  7. Yönetim sunucusunu başlatın:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server başlangıcı

Harici Yetkilendirmeyi Devre Dışı Bırakma

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

  1. /opt/apigee/customer/application/management-server.properties dosyasını açın. kullanabilirsiniz. Dosya yoksa, oluşturun.
  2. Kimlik doğrulama kullanıcı deposunu LDAP olarak değiştirin:
    conf_security_authentication.user.store=ldap
  3. Bu özelliği yanlış olarak ayarlayın:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Yönetim sunucusunu yeniden başlatın:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server başlangıcı

ExternalRoleMapperImpl hakkında örnek uygulama

Daha önce Harici rol eşlemesini etkinleştirme bölümünde açıklanan safety.properties yapılandırma dosyasında şu satıra dikkat edin:

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

Bu sınıf, ExternalRoleMapperServiceV2 arayüzünü uygular ve zorunludur. Şunları yapmanız gerekir: Bu sınıf için, ilgili gruplarınızı yansıtan kendi uygulamanızı oluşturabilirsiniz. Bitirdiğinizde, derlenen sınıfı bir JAR içine yerleştirin ve bu JAR'ı Yönetim Sunucusu'nun sınıf yoluna şu şekilde yerleştirin:

/opt/apigee/edge-management-server/lib/thirdparty/
.

Sınıfı ve paketi, olduğu sürece istediğiniz gibi adlandırabilirsiniz. ExternalRolemapperServiceV2 öğesine sınıf yolunuzdan erişilebilir ve management-server.properties yapılandırma dosyasını oluşturun.

Aşağıda, bir ExternalRoleMapperImpl sınıfının iyi yorumlanmış bir örnek uygulamasını sunuyoruz.

package com.customer.authorization.impl;

import com.apigee.authentication.*;
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 expected namespaces.
*/

public class ExternalRoleMapperImpl
       implements ExternalRoleMapperServiceV2 {

   InitialDirContext dirContext = null;

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

       try {
           // Customer Specific Implementation will override the
           // ImplementDirContextCreationLogicForSysAdmin method implementation.
           // Create InitialDirContext based on the system admin user credentials.
           dirContext = ImplementDirContextCreationLogicForSysAdmin();
       } catch (NamingException e) {
           // TODO Auto-generated catch block
           throw new ConnectionException(e);
       }
   }

   @Override
   public void stop() throws Exception {
   }

   /**
    * This method should be replaced with customer's implementation
    * For given roleName under expectedNamespace, return all users that belongs to this role
    * @param roleName
    * @param expectedNamespace
    * @return All users that belongs to this role. For each user, please return the username/email that is stored in Apigee LDAP
    * @throws ExternalRoleMappingException
    */
   @Override
   public Collection<String> getUsersForRole(String roleName, NameSpace expectedNamespace) throws ExternalRoleMappingException {
       Collection<String> users = new HashSet<>();
       if (expectedNamespace instanceof SystemNamespace) {
           // If requesting all users with sysadmin role
           if (roleName.equalsIgnoreCase("sysadmin")) {
               // Add sysadmin's email to results
               users.add("sysadmin@wacapps.net");
           }
       } else {
           String orgName = ((OrganizationNamespace) expectedNamespace).getOrganization();
           // If requesting all users of engRole in Apigee LDAP
           if (roleName.equalsIgnoreCase("engRole")) {
               // Get all users in corresponding groups in customer's LDAP. In this case looking for 'engGroup';
               SearchControls controls = new SearchControls();
               controls.setSearchScope(1);
               try {
                   NamingEnumeration<SearchResult> res = dirContext.search("ou=groups,dc=corp,dc=wacapps,dc=net",
                           "cn=engGroup", new Object[]{"",""}, controls);
                   while (res.hasMoreElements()) {
                       SearchResult sr = res.nextElement();
                       // Add all users into return
                       users.addAll(sr.getAttributes().get("users").getAll());
                   }
               } catch (NamingException e) {
                   // Customer needs to handle the exception here
               }
           }
       }
       return users;
   }

   /**
    *
    * This method would be implemented by the customer and would be invoked
    * while including using X-Apigee-Current-User header in request.
    *
    * X-Apigee-Current-User allows the customer to login as another user
    *
    * Below is the basic example.
    *
    * If User has sysadmin role then it's expected to set SystemNameSpace
    * along with the expected NameSpace. Otherwise role's expectedNameSpace
    * to be set for the NameSpacedRole.
    *
    * Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>();
    *
    * NameSpacedRole sysNameSpace = new NameSpacedRole("sysadmin",
    * SystemNamespace.get());
    *
    * String orgName =
    * ((OrganizationNamespace) expectedNameSpace).getOrganization();
    *
    * NameSpacedRole orgNameSpace = new NameSpacedRole ("orgadmin",
    * expectedNameSpace);
    *
    * results.add(sysNameSpace);
    *
    * results.add(orgNameSpace);
    *
    *
    * @param username UserA's username
    * @param password UserA's password
    * @param requestedUsername UserB's username. Allow UserA to request UserB's userroles with
    *                          UserA's credentials when requesting UserB as X-Apigee-Current-User
    * @param expectedNamespace
    * @return
    * @throws ExternalRoleMappingException
    */
   @Override
   public Collection<NameSpacedRole> getUserRoles(String username, String password, String requestedUsername, NameSpace expectedNamespace) throws ExternalRoleMappingException {
       /************************************************************/
       /******************** Authenticate UserA ********************/
       /************************************************************/

       // Customer Specific Implementation will override the
       // ImplementDnameLookupLogic method implementation.

       // obtain dnName for given username.
       String dnName = ImplementDnNameLookupLogic(username);
       // Obtain dnName for given requestedUsername.
       String requestedDnName = ImplementDnNameLookupLogic(requestedUsername);

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

       DirContext dirContext = null;
       try {

           // Customer Specific Implementation will override the
           // ImplementDirectoryContextCreationLogic method implementation

           // Create a directory context with dnName or requestedDnName and password
           dirContext = ImplementDirectoryContextCreationLogic();

           /************************************************/
           /*** Map internal groups to apigee-edge roles ***/
           /************************************************/
           return apigeeEdgeRoleMapper(dirContext, requestedDnName, expectedNamespace);

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

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

       return null;

   }

   /**
    *
    * This method would be implemented by the customer and would be invoked
    * wihle using username and password for authentication and without the
    * X-Apigee-Current-User header
    *
    * The customer can reuse implementations in
    *      getUserRoles(String username, String password, String requestedUsername, NameSpace expectedNamespace)
    * by
    *      return getUserRoles(username, password, username, expectedNamespace)
    * in implementations.
    *
    * or the customer can provide new implementations as shown below.
    */

   @Override
   public Collection<NameSpacedRole> getUserRoles(String username, String password, NameSpace expectedNamespace) throws ExternalRoleMappingException {
       /*************************************************************/
       /****************** Authenticate Given User ******************/
       /*************************************************************/

       // Customer Specific Implementation will override the
       // ImplementDnameLookupLogic implementation.

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

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

       DirContext dirContext = null;
       try {
           // Create a directory context with username or dnName and password
           dirContext = ImplementDirectoryContextCreationLogic();

           /************************************************/
           /*** Map internal groups to apigee-edge roles ***/
           /************************************************/
           return apigeeEdgeRoleMapper(dirContext, dnName, expectedNamespace);

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

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

       return null;
   }

   /**
    *
    * This method would be implemented by the customer and would be invoked
    * while using security token or access token as authentication credentials.
    *
    */
   @Override
   public Collection<NameSpacedRole> getUserRoles(String username, NameSpace expectedNamespace) throws ExternalRoleMappingException {

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

       // Customer Specific Implementation will override the
       // ImplementDnameLookupLogic implementation.

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

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

       DirContext dirContext = null;
       try {
           // Create a directory context with username or dnName and password
           dirContext = ImplementDirectoryContextCreationLogic();

           /************************************************/
           /*** Map internal groups to apigee-edge roles ***/
           /************************************************/
           return apigeeEdgeRoleMapper(dirContext, dnName, expectedNamespace);

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

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

       return null;
   }

   /**
    *  This method should be replaced with Customer Specific Implementations
    *
    *  Provided as a sample Implementation of mapping user groups to apigee-edge roles
    */
   private Collection<NameSpacedRole> apigeeEdgeRoleMapper(DirContext dirContext, String dnName, NameSpace expectedNamespace) throws Exception {

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

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

       String groupDN = "OU=Groups,DC=corp,DC=wacapps,DC=net";
       String userFilter = "(user=userDnName)";
       SearchControls controls = new SearchControls();
       controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);

       // Looking for all groups the user belongs to in customer's LDAP
       NamingEnumeration<SearchResult> groups = dirContext.search(groupDN,userFilter.replace("userDnName", dnName), 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 internal groups to apigee-edge roles ***/
               /************************************************/

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

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

               } 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 !!!!!");
       }
       return results;
   }

   /**
    * The customer need to replace with own implementations for getting dnName for given user
    */
   private String ImplementDnNameLookupLogic(String username) {
       // Connect to the customer's own LDAP to fetch user dnName
       return customerLDAP.getDnName(username);
   }

   /**
    * The customer need to replace with own implementations for creating DirContext
    */
   private DirContext ImplementDirectoryContextCreationLogic() {
       // Connect to the customer's own LDAP to create DirContext for given user
       return customerLDAP.createLdapContextUsingCredentials();
   }

}