Ánh xạ vai trò bên ngoài

Edge cho Private Cloud phiên bản 4.17.05

Tính năng Liên kết vai trò bên ngoài cho phép bạn liên kết các nhóm hoặc vai trò của mình với các vai trò kiểm soát quyền truy cập dựa trên vai trò (RBAC) và các nhóm được tạo trên Apigee Edge.

Điều kiện tiên quyết

  • Bạn phải là quản trị viên hệ thống Đám mây riêng tư của Apigee và có thông tin đăng nhập của quản trị viên hệ thống chung thì mới có thể định cấu hình này.
  • Bạn cần biết thư mục gốc của quá trình cài đặt dịch vụ đám mây riêng tư Apigee Edge. Thư mục gốc mặc định là /opt. Nếu bạn chọn một thư mục gốc khác trong quá trình cài đặt đám mây riêng tư Apigee Edge, hãy sử dụng thư mục đó thay vì /opt khi bạn làm theo các hướng dẫn sau.
  • Lấy các tệp JAR bắt buộc từ Apigee.

Đảm bảo người dùng đã đăng ký trên Edge và trong dịch vụ thư mục của bạn

Khi sử dụng tính năng ánh xạ vai trò, tất cả người dùng truy cập vào Edge đều phải tồn tại trong cả dịch vụ thư mục bên ngoài và trong kho lưu trữ dành cho người dùng Edge. Tức là khi thêm một người dùng vào dịch vụ thư mục bên ngoài, bạn cũng phải thêm chính người dùng đó vào kho lưu trữ người dùng Apigee.

Ví dụ: người dùng a01@company.com tồn tại trong nhóm thư mục bên ngoài 'apiadmin'. Sau đó, bạn muốn ánh xạ người dùng a01@company.com với vai trò quản trị viên tổ chức trong Edge. Do đó, trước tiên, người dùng a01@company.com phải được thêm vào nhóm orgadmin trên Edge.

Hãy xem bài viết Tạo người dùng toàn cầu để biết thêm thông tin về cách tạo người dùng Edge và chỉ định họ vào các vai trò.

Cấu hình mặc định

Tính năng ánh xạ vai trò bên ngoài bị tắt theo mặc định.

Bật tính năng ánh xạ vai trò bên ngoài

  1. Trước khi có thể hoàn tất cấu hình sau, bạn phải tạo lớp Java triển khai giao diện ExternalRoleMapperService. Để biết thông tin chi tiết về quá trình triển khai này, hãy xem hoạt động triển khai mẫu bên dưới.
  2. Đăng nhập vào Máy chủ quản lý Apigee Edge rồi dừng Máy chủ quản lý:
    > /opt/apigee/apigee-service/bin/apigee-service cạnh-management-server dừng
  3. Kiểm tra trạng thái của máy chủ. Đảm bảo Máy chủ quản lý đã dừng/không chạy:
    > /opt/apigee/apigee-service/bin/apigee-all trạng thái
  4. Mở /opt/apigee/customer/application/management-server.properties trong trình chỉnh sửa văn bản.
  5. Chỉnh sửa tệp management-server.properties bằng các chế độ cài đặt sau: 
    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


    Quan trọng: Lớp triển khai và tên gói được đề cập ở trên, ExternalRoleMapperImpl chỉ là một ví dụ -- đây là một lớp bạn phải triển khai và bạn có thể đặt tên bất kỳ cho lớp cũng như gói. Để biết thông tin chi tiết về cách triển khai lớp này, hãy xem phương thức triển khai mẫu bên dưới.
  6. Lưu tệp management-server.properties.
  7. Khởi động máy chủ quản lý:
    > /opt/apigee/apigee-service/bin/apigee-service cạnh-management-server bắt đầu
  8. Xác minh rằng máy chủ đang chạy:
    > /opt/apigee/apigee-service/bin/apigee-all trạng thái

Tắt tính năng uỷ quyền bên ngoài

Để tắt cho phép bên ngoài, hãy làm như sau:

  1. Mở /opt/apigee/customer/application/management-server.properties trong trình chỉnh sửa văn bản.
  2. Thay đổi kho lưu trữ xác thực của người dùng thành ldap:
    conf_security_authentication.user.store=ldap
  3. Đặt thuộc tính sau thành false:
    conf_security_externalized.authentication.role.mapper.enabled=false
  4. Khởi động lại máy chủ quản lý:
    > /opt/apigee/apigee-service/bin/apigee-service khởi động lại cạnh-management-server

Giới thiệu về hoạt động triển khai mẫu ExternalRoleMapperImpl

Trong tệp cấu hình management-server.properties được mô tả ở trên, hãy lưu ý dòng sau:

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

Lớp này triển khai giao diện ExternalRoleMapperService và là lớp bắt buộc. Bạn cần tự triển khai lớp này để phản ánh các nhóm tương ứng của mình. Khi hoàn tất, hãy đặt lớp đã biên dịch vào tệp JAR và đặt JAR đó vào /<install_dir>/apigee/edge-gateway/lib/infra/libraries.

Bạn có thể đặt tên cho lớp và gói bất kỳ điều gì bạn muốn, miễn là lớp đó triển khai ExternalRoleMapperService, có thể truy cập được trong classpath của bạn và được tham chiếu chính xác trong tệp cấu hình management-server.properties.

Dưới đây là một phương thức triển khai mẫu được nhận xét kỹ lưỡng về một lớp ExternalRoleMapperImpl. Để biên dịch lớp này, bạn phải tham chiếu tệp JAR sau đây đi kèm với 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);

        }

    }

}