বাহ্যিক ভূমিকা ম্যাপিং

ব্যক্তিগত ক্লাউডের জন্য প্রান্ত v. 4.17.05

বাহ্যিক ভূমিকা ম্যাপিং আপনাকে আপনার নিজের গোষ্ঠী বা ভূমিকাগুলিকে রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোল (RBAC) ভূমিকা এবং Apigee Edge-এ তৈরি করা গ্রুপগুলিতে ম্যাপ করতে দেয়৷

পূর্বশর্ত

  • এই কনফিগারেশনটি সম্পাদন করার জন্য আপনাকে অবশ্যই গ্লোবাল সিস্টেম অ্যাডমিন শংসাপত্র সহ Apigee প্রাইভেট ক্লাউড সিস্টেম অ্যাডমিনিস্ট্রেটর হতে হবে।
  • আপনার Apigee Edge প্রাইভেট ক্লাউড ইনস্টলেশনের রুট ডিরেক্টরি জানতে হবে। ডিফল্ট রুট ডিরেক্টরি হল /opt. Apigee Edge Private Cloud ইনস্টলেশনের সময় আপনি যদি একটি ভিন্ন রুট ডিরেক্টরি বেছে নেন, তাহলে এই নির্দেশাবলী অনুসরণ করার জন্য /opt এর পরিবর্তে এটি ব্যবহার করুন।
  • Apigee থেকে প্রয়োজনীয় JAR ফাইলগুলি পান।

নিশ্চিত করুন যে ব্যবহারকারীরা এজ এবং আপনার ডিরেক্টরি পরিষেবাতে নিবন্ধিত হয়েছেন

ভূমিকা ম্যাপিং ব্যবহার করার সময়, এজ অ্যাক্সেসকারী সমস্ত ব্যবহারকারীদের অবশ্যই আপনার বাহ্যিক ডিরেক্টরি পরিষেবা এবং এজ ব্যবহারকারী সংগ্রহস্থলে উপস্থিত থাকতে হবে। এর মানে আপনি যখন আপনার বাহ্যিক ডিরেক্টরি পরিষেবাতে একজন ব্যবহারকারীকে যুক্ত করেন, আপনাকে অবশ্যই সেই একই ব্যবহারকারীকে Apigee ব্যবহারকারী সংগ্রহস্থলে যুক্ত করতে হবে।

উদাহরণস্বরূপ, ব্যবহারকারী a01@company.com আপনার বহিরাগত ডিরেক্টরি গ্রুপ 'apiadmin'- এ বিদ্যমান। তারপরে আপনি ব্যবহারকারী a01@company.com কে এজ-এর অর্গানডমিন ভূমিকায় ম্যাপ করতে চান। তাই, ব্যবহারকারী a01@company.com কে প্রথমে এজ-এর orgadmin গ্রুপে যোগ করতে হবে।

এজ ব্যবহারকারী তৈরি করা এবং তাদের ভূমিকা নির্ধারণের বিষয়ে আরও জানতে বিশ্বব্যাপী ব্যবহারকারী তৈরি করা দেখুন।

ডিফল্ট কনফিগারেশন

বাহ্যিক ভূমিকা ম্যাপিং ডিফল্টরূপে অক্ষম করা হয়৷

বাহ্যিক ভূমিকা ম্যাপিং সক্ষম করা হচ্ছে

  1. আপনি নিম্নলিখিত কনফিগারেশনটি সম্পূর্ণ করার আগে, আপনাকে অবশ্যই একটি জাভা ক্লাস তৈরি করতে হবে যা ExternalRoleMapperService ইন্টারফেস প্রয়োগ করে। এই বাস্তবায়ন সম্পর্কে বিস্তারিত জানার জন্য, নীচের নমুনা বাস্তবায়ন দেখুন।
  2. আপনার Apigee এজ ম্যানেজমেন্ট সার্ভারে লগ ইন করুন এবং তারপর ম্যানেজমেন্ট সার্ভার বন্ধ করুন:
    > /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
  3. সার্ভারের অবস্থা পরীক্ষা করুন। ম্যানেজমেন্ট সার্ভার বন্ধ/চলছে না তা নিশ্চিত করুন:
    > /opt/apigee/apigee-service/bin/apigee-সমস্ত স্থিতি
  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 প্রান্ত-ব্যবস্থাপনা-সার্ভার শুরু
  8. সার্ভার চলছে কিনা যাচাই করুন:
    > /opt/apigee/apigee-service/bin/apigee-সমস্ত স্থিতি

বাহ্যিক অনুমোদন অক্ষম করা হচ্ছে

বাহ্যিক অনুমোদন অক্ষম করতে:

  1. একটি টেক্সট এডিটরে /opt/apigee/customer/application/management-server.properties খুলুন।
  2. ldap এ প্রমাণীকরণ ব্যবহারকারী স্টোর পরিবর্তন করুন:
    conf_security_authentication.user.store=ldap
  3. নিম্নলিখিত সম্পত্তি মিথ্যা সেট করুন:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. ম্যানেজমেন্ট সার্ভার পুনরায় চালু করুন:
    > /opt/apigee/apigee-service/bin/apigee-service এজ-ম্যানেজমেন্ট-সার্ভার পুনরায় চালু করুন

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 ফাইলটি উল্লেখ করতে হবে:

/<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);

        }

    }

}