نقشه برداری نقش خارجی، نقشه برداری نقش خارجی

Edge for Private Cloud نسخه 4.17.05

نگاشت نقش خارجی به شما امکان می دهد گروه ها یا نقش های خود را به نقش ها و گروه های کنترل دسترسی مبتنی بر نقش (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. قبل از اینکه بتوانید پیکربندی زیر را تکمیل کنید، باید یک کلاس جاوا ایجاد کنید که رابط ExternalRoleMapperService را پیاده سازی کند. برای جزئیات بیشتر در مورد این پیاده سازی، نمونه اجرای زیر را ببینید.
  2. به سرور مدیریت Apigee Edge خود وارد شوید و سپس سرور مدیریت را متوقف کنید:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. وضعیت سرورها را بررسی کنید. مطمئن شوید که سرور مدیریت متوقف شده است/در حال اجرا نیست:
    > وضعیت /opt/apigee/apigee-service/bin/apigee-all
  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

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

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

  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 را پیاده سازی کند، در مسیر کلاس شما قابل دسترسی باشد و به درستی در فایل پیکربندی 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);

        }

    }

}