الإصدار 4.17.05 من 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 وإسناد الأدوار إليهم.
الإعدادات التلقائية
يتم إيقاف تعيين الأدوار الخارجية تلقائيًا.
تفعيل ميزة "ربط الأدوار الخارجية"
- قبل إكمال الإعدادات التالية، عليك إنشاء فئة Java التي تنفّذ واجهة ExternalRoleMapperService. للحصول على تفاصيل حول عملية التنفيذ هذه، يُرجى الاطّلاع على نموذج التنفيذ أدناه.
- سجِّل الدخول إلى خادم إدارة Apigee Edge، ثم أوقِف خادم الإدارة:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop - تحقَّق من حالة الخوادم. تأكَّد من إيقاف خادم الإدارة أو عدم تشغيله:
> /opt/apigee/apigee-service/bin/apigee-all status - افتح /opt/apigee/customer/application/management-server.properties في محرِّر نصوص.
- عدِّل الملف 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، هما مثال فقط، وهي فئة يجب تنفيذها ويمكنك تسمية الفئة والحزمة كما تريد. للحصول على تفاصيل حول تنفيذ هذه الفئة، يُرجى الاطّلاع على نموذج التنفيذ أدناه. - احفظ ملف management-server.properties.
- ابدأ تشغيل خادم الإدارة:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server start - تأكَّد من أنّ الخادم قيد التشغيل:
> /opt/apigee/apigee-service/bin/apigee-all status
إيقاف التفويض الخارجي
لإيقاف التفويض الخارجي:
- افتح /opt/apigee/customer/application/management-server.properties في محرِّر نصوص.
- غيِّر مخزن مستخدمي المصادقة إلى ldap:
conf_security_authentication.user.store=ldap - اضبط السمة التالية على "خطأ":
conf_security_externalized.authentication.role.mapper.enabled=false - أعِد تشغيل خادم الإدارة:
> /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); } } }