Pemetaan Peran Eksternal

Edge untuk Private Cloud v. 4.17.05

Dengan Pemetaan Peran Eksternal, Anda dapat memetakan grup atau peran Anda sendiri ke peran kontrol akses berbasis peran (RBAC) dan grup yang dibuat di Apigee Edge. 

Prasyarat

  • Anda harus menjadi administrator sistem Apigee Private Cloud dengan kredensial admin sistem global untuk menjalankan konfigurasi ini. 
  • Anda perlu mengetahui direktori utama penginstalan Apigee Edge Private Cloud Anda. Direktori {i>root<i} {i>default<i} adalah /opt. Jika Anda memilih direktori utama yang berbeda selama penginstalan Apigee Edge Private Cloud, gunakan direktori tersebut, bukan /opt, saat mengikuti petunjuk ini.
  • Dapatkan file JAR yang diperlukan dari Apigee.

Pastikan pengguna terdaftar di Edge dan di layanan direktori Anda

Saat menggunakan pemetaan peran, semua pengguna yang mengakses Edge harus ada di layanan direktori eksternal dan di repositori pengguna Edge. Artinya, saat Anda menambahkan pengguna ke layanan direktori eksternal, Anda juga harus menambahkan pengguna yang sama tersebut ke repositori pengguna Apigee.

Misalnya, pengguna a01@company.com ada di grup direktori eksternal 'apiadmin' Anda. Selanjutnya, Anda ingin memetakan pengguna a01@company.com ke peran orgadmin di Edge. Oleh karena itu, pengguna a01@company.com harus ditambahkan terlebih dahulu ke grup orgadmin di Edge. 

Lihat Membuat pengguna global untuk mengetahui informasi selengkapnya tentang cara membuat pengguna Edge dan menetapkan mereka ke peran.

Konfigurasi default

Pemetaan peran eksternal dinonaktifkan secara default.

Mengaktifkan Pemetaan Peran Eksternal

  1. Sebelum dapat menyelesaikan konfigurasi berikut, Anda harus membuat class Java yang mengimplementasikan antarmuka ExternalRoleMapperService. Untuk mengetahui detail tentang implementasi ini, lihat contoh implementasi di bawah.
  2. Login ke Server Pengelolaan Apigee Edge Anda, lalu hentikan Server Pengelolaan:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. Periksa status server. Pastikan Server Pengelolaan berhenti/tidak berjalan:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. Buka /opt/apigee/customer/application/management-server.properties di editor teks.
  5. Edit file management-server.properties dengan setelan berikut:
    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.ExternalRoleMapper apa pun yang Anda inginkan dan nama paket yang Anda inginkan


    Untuk mengetahui detail tentang implementasi class ini, lihat contoh implementasi di bawah. 
  6. Simpan file management-server.properties.
  7. Mulai Server Pengelolaan:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server start
  8. Pastikan server berjalan:
    > /opt/apigee/apigee-service/bin/apigee-all status

Menonaktifkan Otorisasi Eksternal

Untuk menonaktifkan otorisasi eksternal:

  1. Buka /opt/apigee/customer/application/management-server.properties di editor teks.
  2. Ubah penyimpanan pengguna autentikasi ke ldap:
    conf_security_authentication.user.store=ldap
  3. Tetapkan properti berikut ke false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Mulai ulang Server Pengelolaan:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart

Tentang penerapan contoh ExternalRoleMapperImpl

Pada file konfigurasi management-server.properties yang dijelaskan di atas, perhatikan baris ini:

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

Class ini menerapkan antarmuka ExternalRoleMapperService, dan wajib ada. Anda perlu membuat implementasi class ini sendiri yang mencerminkan grup Anda masing-masing. Setelah selesai, tempatkan class yang dikompilasi di JAR dan masukkan JAR tersebut di /<install_dir>/apigee/edge-gateway/lib/infra/libraries

Anda dapat memberi nama class dan memaketkan apa pun yang diinginkan selama class tersebut menerapkan ExternalRoleMapperService, dapat diakses di classpath Anda, dan direferensikan dengan benar di file konfigurasi management-server.properties

Berikut adalah contoh penerapan class ExternalRoleMapperImpl yang telah dikomentari dengan baik. Untuk mengompilasi class ini, Anda harus mereferensikan file JAR berikut yang disertakan dengan 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);

        }

    }

}