نگاشت نقش خارجی

Edge for Private Cloud نسخه ۴.۱۷.۰۵

«نگاشت نقش خارجی» به شما امکان می‌دهد گروه‌ها یا نقش‌های خودتان را به نقش‌ها و گروه‌های کنترل دسترسی نقش‌مبنا (RBAC) ایجادشده در Apigee Edge نگاشت کنید. 

پیش‌نیازها

  • برای انجام این پیکربندی، باید سرپرست سیستم Apigee Private Cloud با اطلاعات کاربری سرپرست سیستم جهانی باشید. 
  • باید دایرکتوری ریشه نصب Apigee Edge Private Cloud را بدانید. دایرکتوری ریشه پیش‌فرض /opt است. اگر درطول نصب Apigee Edge Private Cloud دایرکتوری ریشه دیگری را انتخاب کرده‌اید، هنگام دنبال کردن این دستورالعمل‌ها از آن به‌جای opt /استفاده کنید.
  • فایل‌های JAR موردنیاز را از Apigee دریافت کنید.

مطمئن شوید کاربران در Edge و در سرویس دایرکتوری شما ثبت شده باشند

هنگام استفاده از نگاشت نقش، همه کاربرانی که به Edge دسترسی دارند باید هم در سرویس دایرکتوری خارجی شما و هم در مخزن کاربر Edge وجود داشته باشند. یعنی وقتی کاربری را به سرویس دایرکتوری خارجی‌تان اضافه می‌کنید، باید همان کاربر را به مخزن کاربر Apigee نیز اضافه کنید.

برای مثال، کاربر a01@company.com در گروه فهرست راهنمای خارجی شما 'apiadmin' وجود دارد. سپس می‌خواهید کاربر a01@company.com را به نقش orgadmin در Edge نگاشت کنید. بنابراین، کاربر a01@company.com ابتدا باید به گروه orgadmin در Edge اضافه شود. 

برای کسب اطلاعات بیشتر درباره ایجاد کاربران Edge و اختصاص دادن آن‌ها به نقش‌ها، ایجاد کاربران جهانی را ببینید.

پیکربندی پیش‌فرض

نگاشت نقش خارجی به‌طور پیش‌فرض غیرفعال است.

درحال فعال کردن «نگاشت نقش خارجی»

  1. قبل‌از اینکه بتوانید پیکربندی زیر را تکمیل کنید، باید کلاس Java ایجاد کنید که میانای ExternalRoleMapperService را پیاده‌سازی کند. برای جزئیات مربوط به این پیاده‌سازی، نمونه پیاده‌سازی زیر را ببینید.
  2. به سیستم Apigee Edge Management Server وارد شوید و سپس Management Server را متوقف کنید:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. وضعیت سرورها را بررسی کنید. مطمئن شوید که «سرور مدیریت» متوقف شده است/درحال اجرا نیست:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. /opt/apigee/customer/application/management-server.properties را در ویرایشگر نوشتار باز کنید.
  5. فایل 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.ExternalRoleMapperImpl


    مهم: کلاس پیاده‌سازی و نام بسته ارجاع‌شده در بالا، ExternalRoleMapperImpl، فقط یک نمونه است -- این کلاسی است که باید پیاده‌سازی کنید و می‌توانید نام کلاس و بسته را هرچه می‌خواهید بگذارید. برای جزئیات مربوط به پیاده‌سازی این کلاس، نمونه پیاده‌سازی زیر را ببینید. 
  6. فایل management-server.properties را ذخیره کنید.
  7. «سرور مدیریت» را راه‌اندازی کنید:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server start
  8. درستی‌سنجی کنید که سرور درحال اجرا است:
    > /opt/apigee/apigee-service/bin/apigee-all status

غیرفعال کردن مجوز خارجی

برای غیرفعال کردن مجوزدهی خارجی:

  1. /opt/apigee/customer/application/management-server.properties را در ویرایشگر نوشتار باز کنید.
  2. فروشگاه کاربر اصالت‌سنجی را به ldap تغییر دهید:
    conf_security_authentication.user.store=ldap
  3. خصوصیت زیر را روی false تنظیم کنید:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. «سرور مدیریت» را بازراه‌اندازی کنید:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart

درباره پیاده‌سازی نمونه ExternalRoleMapperImpl

در فایل پیکربندی management-server.properties که در بالا شرح داده شد، به این خط توجه کنید:

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

این کلاس میانای ExternalRoleMapperService را پیاده‌سازی می‌کند و الزامی است. باید پیاده‌سازی خودتان را از این کلاس ایجاد کنید که گروه‌های مربوطه شما را منعکس کند. پس‌از اتمام، کلاس کامپایل‌شده را در یک JAR قرار دهید و آن JAR را در /<install_dir>/apigee/edge-gateway/lib/infra/libraries قرار دهید. 

می‌توانید هر نامی که می‌خواهید برای کلاس و بسته انتخاب کنید، به‌شرطی که ExternalRoleMapperService را پیاده‌سازی کند، در classpath شما قابل‌دسترسی باشد، و به‌درستی در فایل پیکربندی management-server.properties به آن ارجاع داده شده باشد. 

در زیر نمونه‌ای از پیاده‌سازی کلاس ExternalRoleMapperImpl با توضیحات کامل ارائه شده است. برای کامپایل کردن این کلاس، باید به فایل JAR زیر که در 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);

        }

    }

}