ربط الأدوار الخارجية

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. قبل أن تتمكن من إكمال التهيئة التالية، يجب إنشاء فئة Java تنفّذ واجهة ExternalRoleMapperService. للحصول على تفاصيل حول عملية التنفيذ هذه، يُرجى الاطّلاع على نموذج التنفيذ أدناه.
  2. سجِّل الدخول إلى خادم Apigee Edge Management Server ثم أوقِف خادم الإدارة:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server تستخدمه
  3. التحقّق من حالة الخوادم تأكَّد من أنّ خادم الإدارة متوقِّف أو لا يعمل:
    > /opt/apigee/apigee-service/bin/apigee-all status
  4. افتح /opt/apigee/customer/application/management-server.properties في محرِّر نصوص.
  5. عدِّل الملف management-server.properties بالإعدادات التالية:
    conf_security_authentction.user.store=externalized.authentction
    conf_security_externalized.authentification.role.mapper.enabled=true
    conf_security_externalized.authentction.role.mapper.usage.class=com.customer.usage.class=com.customer.usage.impl. .


    لمعرفة تفاصيل عن تنفيذ هذا الصف، يُرجى الاطّلاع على نموذج التنفيذ أدناه. 
  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_authentction.user.store=ldap
  3. اضبط السمة التالية على "خطأ":
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. أعِد تشغيل خادم الإدارة:
    > /opt/apigee/apigee-service/bin/apigee-service Edge-management-server إعادة تشغيل

لمحة عن تنفيذ نموذج ExternalRoleMapperImpl

في ملف الإعداد management-server.properties الموضّح أعلاه، لاحظ السطر التالي:

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

تنفِّذ هذه الفئة الواجهة ExternalRoleMapperService، وهي مطلوبة. يجب إنشاء عمليات التنفيذ الخاصة بك لهذا الصف والتي تعكس المجموعات المعنيّة. عند الانتهاء، ضَع الفئة المجمّعة في 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);

        }

    }

}