Tạo trình kết nối danh tính

Theo mặc định, Google Cloud Search chỉ nhận dạng danh tính Google được lưu trữ trong Google Cloud Directory (người dùng và nhóm). Trình kết nối danh tính được dùng để đồng bộ hóa danh tính của doanh nghiệp với danh tính của Google mà Google Cloud Search sử dụng.

Google cung cấp các lựa chọn sau đây để phát triển trình kết nối danh tính:

  • SDK Trình kết nối danh tính. Tuỳ chọn này dành cho các nhà phát triển lập trình bằng ngôn ngữ lập trình Java. SDK Trình kết nối danh tính là một trình bao bọc xung quanh API REST cho phép bạn nhanh chóng tạo các trình kết nối. Để tạo trình kết nối danh tính bằng SDK, hãy tham khảo bài viết Tạo trình kết nối danh tính bằng SDK trình kết nối danh tính.

  • API REST và thư viện API REST cấp thấp. Các tuỳ chọn này dành cho những nhà phát triển có thể không lập trình bằng Java hoặc có cơ sở mã phù hợp hơn với API REST hoặc thư viện. Để tạo một trình kết nối danh tính bằng API REST, hãy tham khảo Directory API: User Accounts (API Thư mục: Tài khoản người dùng) để biết thông tin về người dùng ánh xạ và Tài liệu về Cloud Identity để biết thông tin về nhóm liên kết.

Tạo trình kết nối danh tính bằng SDK trình kết nối danh tính

Trình kết nối danh tính thông thường sẽ thực hiện các tác vụ sau:

  1. Định cấu hình trình kết nối.
  2. Truy xuất tất cả người dùng từ hệ thống thông tin nhận dạng doanh nghiệp của bạn và gửi họ cho Google để đồng bộ hoá với các danh tính trên Google.
  3. Truy xuất tất cả nhóm từ hệ thống thông tin nhận dạng doanh nghiệp của bạn và gửi các nhóm đó cho Google để đồng bộ hoá với các danh tính trên Google.

Thiết lập phần phụ thuộc

Bạn phải đưa một số phần phụ thuộc nhất định vào tệp bản dựng để sử dụng SDK. Hãy nhấp vào một thẻ bên dưới để xem các phần phụ thuộc trong môi trường tạo bản dựng của bạn:

Maven

<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-identity-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>

Gradle

 compile group: 'com.google.enterprise.cloudsearch',
         name: 'google-cloudsearch-identity-connector-sdk',
         version: 'v1-0.0.3'

Tạo cấu hình trình kết nối

Mỗi trình kết nối có một tệp cấu hình chứa các tham số mà trình kết nối sử dụng, chẳng hạn như mã nhận dạng cho kho lưu trữ của bạn. Các tham số được xác định là cặp khoá-giá trị, chẳng hạn như api.sourceId=1234567890abcdef.

SDK Google Cloud Search chứa một số tham số cấu hình do Google cung cấp mà tất cả các trình kết nối sử dụng. Bạn phải khai báo các tham số do Google cung cấp sau đây trong tệp cấu hình:

  • Đối với trình kết nối nội dung, bạn phải khai báo api.sourceIdapi.serviceAccountPrivateKeyFile vì các tham số này xác định vị trí của kho lưu trữ và khoá riêng tư cần thiết để truy cập vào kho lưu trữ.
  • Đối với trình kết nối danh tính, bạn phải khai báo api.identitySourceId vì tham số này xác định vị trí của nguồn nhận dạng bên ngoài. Nếu đang đồng bộ hoá người dùng, bạn cũng phải khai báo api.customerId là mã nhận dạng duy nhất cho tài khoản Google Workspace của doanh nghiệp.

Bạn không cần khai báo các tham số đó trong tệp cấu hình, trừ phi muốn ghi đè giá trị mặc định của các tham số khác do Google cung cấp. Để biết thêm thông tin về các tham số cấu hình do Google cung cấp, chẳng hạn như cách tạo một số mã nhận dạng và khoá nhất định, hãy tham khảo bài viết Tham số cấu hình do Google cung cấp.

Bạn cũng có thể xác định các tham số dành riêng cho kho lưu trữ của riêng mình để sử dụng trong tệp cấu hình.

Truyền tệp cấu hình đến trình kết nối

Đặt thuộc tính hệ thống config để truyền tệp cấu hình đến trình kết nối. Bạn có thể đặt thuộc tính bằng cách sử dụng đối số -D khi khởi động trình kết nối. Ví dụ: lệnh sau đây khởi động trình kết nối bằng tệp cấu hình MyConfig.properties:

java -classpath myconnector.jar;... -Dconfig=MyConfig.properties MyConnector

Nếu đối số này bị thiếu, SDK sẽ tìm cách truy cập vào tệp cấu hình mặc định có tên connector-config.properties.

Tạo trình kết nối danh tính đồng bộ hoá đầy đủ bằng lớp mẫu

SDK Trình kết nối danh tính chứa một lớp mẫu FullSyncIdentityConnector mà bạn có thể dùng để đồng bộ hoá tất cả người dùng và nhóm từ kho lưu trữ danh tính với danh tính trên Google. Phần này giải thích cách sử dụng mẫu FullSyncIdentityConnector để đồng bộ hoá toàn bộ người dùng và nhóm từ một kho lưu trữ danh tính không phải của Google.

Phần này của tài liệu đề cập đến các đoạn mã từ mẫu IdentityConnecorSample.java. Mẫu này đọc thông tin nhận dạng người dùng và nhóm trong 2 tệp CSV, rồi đồng bộ hoá các thông tin đó với các thông tin nhận dạng của Google.

Triển khai điểm truy cập của trình kết nối

Điểm truy cập vào trình kết nối là phương thức main(). Nhiệm vụ chính của phương thức này là tạo một bản sao của lớp Application và gọi phương thức start() để chạy trình kết nối.

Trước khi gọi application.start(), hãy dùng lớp IdentityApplication.Builder để tạo bản sao mẫu FullSyncIdentityConnector. FullSyncIdentityConnector chấp nhận đối tượng Repository có các phương thức bạn sẽ triển khai. Đoạn mã sau đây cho biết cách triển khai phương thức main():

IdentityConnectorSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * sync connector. In the full sync case, the repository is responsible
 * for providing a snapshot of the complete identity mappings and
 * group rosters. This is then reconciled against the current set
 * of mappings and groups in Cloud Directory.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new CsvRepository();
  IdentityConnector connector = new FullSyncIdentityConnector(repository);
  IdentityApplication application = new IdentityApplication.Builder(connector, args).build();
  application.start();
}

Ở hậu trường, SDK gọi phương thức initConfig() sau khi phương thức main() của trình kết nối gọi Application.build. Phương thức initConfig() thực hiện các tác vụ sau:

  1. Gọi phương thức Configuation.isInitialized() để đảm bảo rằng Configuration chưa được khởi động.
  2. Khởi động một đối tượng Configuration bằng các cặp khoá-giá trị do Google cung cấp. Mỗi cặp khoá-giá trị được lưu trữ trong đối tượng ConfigValue ở đối tượng Configuration.

Triển khai giao diện Repository

Mục đích duy nhất của đối tượng Repository là thực hiện đồng bộ hoá danh tính kho lưu trữ với các danh tính của Google. Khi sử dụng mẫu, bạn chỉ cần ghi đè một số phương thức nhất định trong giao diện Repository để tạo trình kết nối danh tính. Đối với FullTraversalConnector, bạn có thể sẽ ghi đè các phương thức sau:

  • Phương thức init(). Để thực hiện việc thiết lập và khởi tạo kho lưu trữ danh tính bất kỳ, hãy ghi đè phương thức "init()".

  • Phương thức listUsers(). Để đồng bộ hoá tất cả người dùng trong kho lưu trữ danh tính với người dùng Google, hãy ghi đè phương thức listUsers().

  • Phương thức listGroups(). Để đồng bộ hoá tất cả các nhóm trong kho lưu trữ danh tính với Google Groups, hãy ghi đè phương thức listGroups().

  • (không bắt buộc) Phương thức close(). Nếu bạn cần dọn dẹp kho lưu trữ, hãy ghi đè phương thức close(). Phương thức này được gọi một lần trong khi trình kết nối tắt.

Nhận thông số cấu hình tuỳ chỉnh

Trong quá trình xử lý cấu hình của trình kết nối, bạn cần lấy mọi thông số tuỳ chỉnh từ đối tượng Configuration. Tác vụ này thường được thực hiện trong phương thức init() của lớp Repository.

Lớp Configuration có một số phương thức để lấy nhiều loại dữ liệu từ một cấu hình. Mỗi phương thức trả về một đối tượng ConfigValue. Sau đó, bạn sẽ sử dụng phương thức get() của đối tượng ConfigValue để truy xuất giá trị thực tế. Đoạn mã sau đây cho biết cách truy xuất giá trị userMappingCsvPathgroupMappingCsvPath từ đối tượng Configuration:

IdentityConnectorSample.java
/**
 * Initializes the repository once the SDK is initialized.
 *
 * @param context Injected context, contains convenienve methods
 *                for building users & groups
 * @throws IOException if unable to initialize.
 */
@Override
public void init(RepositoryContext context) throws IOException {
  log.info("Initializing repository");
  this.context = context;
  userMappingCsvPath = Configuration.getString(
      "sample.usersFile", "users.csv").get().trim();
  groupMappingCsvPath = Configuration.getString(
      "sample.groupsFile", "groups.csv").get().trim();
}

Để nhận và phân tích cú pháp một tham số chứa nhiều giá trị, hãy sử dụng một trong các trình phân tích cú pháp loại của lớp Configuration để phân tích cú pháp dữ liệu thành các phần riêng biệt. Đoạn mã sau (từ trình kết nối hướng dẫn) dùng phương thức getMultiValue để lấy danh sách tên kho lưu trữ GitHub:

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

Tải mối liên kết cho tất cả người dùng

Ghi đè listUsers() để truy xuất mối liên kết cho tất cả người dùng từ kho lưu trữ danh tính. Phương thức listUsers() chấp nhận một điểm kiểm tra đại diện cho danh tính cuối cùng sẽ được đồng bộ hoá. Bạn có thể sử dụng điểm kiểm tra này để tiếp tục đồng bộ hoá nếu quá trình bị gián đoạn. Đối với mỗi người dùng trong kho lưu trữ, bạn sẽ thực hiện các bước sau trong phương thức listUsers():

  1. Nhận một mối liên kết bao gồm danh tính trên Google và danh tính bên ngoài được liên kết.
  2. Đóng gói cặp vào một biến lặp do phương thức listUsers() trả về.

Liên kết người dùng

Đoạn mã sau đây minh hoạ cách truy xuất mối liên kết danh tính được lưu trữ trong tệp CSV:

IdentityConnectorSample.java
/**
 * Retrieves all user identity mappings for the identity source. For the
 * full sync connector, the repository must provide a complete snapshot
 * of the mappings. This is reconciled against the current mappings
 * in Cloud Directory. All identity mappings returned here are
 * set in Cloud Directory. Any previously mapped users that are omitted
 * are unmapped.
 *
 * The connector does not create new users. All users are assumed to
 * exist in Cloud Directory.
 *
 * @param checkpoint Saved state if paging over large result sets. Not used
 *                   for this sample.
 * @return Iterator of user identity mappings
 * @throws IOException if unable to read user identity mappings
 */
@Override
public CheckpointCloseableIterable<IdentityUser> listUsers(byte[] checkpoint)
    throws IOException {
  List<IdentityUser> users = new ArrayList<>();
  try (Reader in = new FileReader(userMappingCsvPath)) {
    // Read user mappings from CSV file
    CSVParser parser = CSVFormat.RFC4180
        .withIgnoreSurroundingSpaces()
        .withIgnoreEmptyLines()
        .withCommentMarker('#')
        .parse(in);
    for (CSVRecord record : parser.getRecords()) {
      // Each record is in form: "primary_email", "external_id"
      String primaryEmailAddress = record.get(0);
      String externalId = record.get(1);
      if (primaryEmailAddress.isEmpty() || externalId.isEmpty()) {
        // Skip any malformed mappings
        continue;
      }
      log.info(() -> String.format("Adding user %s/%s",
          primaryEmailAddress, externalId));

      // Add the identity mapping
      IdentityUser user = context.buildIdentityUser(
          primaryEmailAddress, externalId);
      users.add(user);
    }
  }
  // ...
}

Đóng gói ánh xạ người dùng vào một biến lặp

Phương thức listUsers() sẽ trả về một Iterator, cụ thể là CheckpointCloseableIterable của các đối tượng IdentityUser. Bạn có thể sử dụng lớp CheckpointClosableIterableImpl.Builder để tạo và trả về một biến lặp. Đoạn mã sau đây cho biết cách đóng gói từng mục ánh xạ vào bản dựng danh sách trình lặp lại từ danh sách đó:

IdentityConnectorSample.java
CheckpointCloseableIterable<IdentityUser> iterator =
  new CheckpointCloseableIterableImpl.Builder<IdentityUser>(users)
      .setHasMore(false)
      .setCheckpoint((byte[])null)
      .build();

Tạo một nhóm

Ghi đè listGroups() để truy xuất tất cả các nhóm và thành viên của các nhóm đó từ kho lưu trữ danh tính của bạn. Phương thức listGroups() chấp nhận một điểm kiểm tra biểu thị danh tính cuối cùng cần đồng bộ hoá. Bạn có thể sử dụng điểm kiểm tra này để tiếp tục đồng bộ hoá nếu quá trình bị gián đoạn. Đối với mỗi người dùng trong kho lưu trữ, bạn sẽ thực hiện các bước sau trong phương thức listGroups():

  1. Xem nhóm và các thành viên trong nhóm.
  2. Đóng gói mỗi nhóm và các thành viên vào một biến lặp do phương thức listGroups() trả về.

Lấy danh tính nhóm

Đoạn mã sau đây minh hoạ cách truy xuất các nhóm và thành viên được lưu trữ trong tệp CSV:

IdentityConnectorSample.java
/**
 * Retrieves all group rosters for the identity source. For the
 * full sync connector, the repository must provide a complete snapshot
 * of the rosters. This is reconciled against the current rosters
 * in Cloud Directory. All groups and members  returned here are
 * set in Cloud Directory. Any previously created groups or members
 * that are omitted are removed.
 *
 * @param checkpoint Saved state if paging over large result sets. Not used
 *                   for this sample.
 * @return Iterator of group rosters
 * @throws IOException if unable to read groups
 */    @Override
public CheckpointCloseableIterable<IdentityGroup> listGroups(byte[] checkpoint)
    throws IOException {
  List<IdentityGroup> groups = new ArrayList<>();
  try (Reader in = new FileReader(groupMappingCsvPath)) {
    // Read group rosters from CSV
    CSVParser parser = CSVFormat.RFC4180
        .withIgnoreSurroundingSpaces()
        .withIgnoreEmptyLines()
        .withCommentMarker('#')
        .parse(in);
    for (CSVRecord record : parser.getRecords()) {
      // Each record is in form: "group_id", "member"[, ..., "memberN"]
      String groupName = record.get(0);
      log.info(() -> String.format("Adding group %s", groupName));
      // Parse the remaining columns as group memberships
      Supplier<Set<Membership>> members = new MembershipsSupplier(record);
      IdentityGroup group = context.buildIdentityGroup(groupName, members);
      groups.add(group);
    }
  }
  // ...

}

Đóng gói nhóm và các thành viên vào một biến lặp

Phương thức listGroups() sẽ trả về một Iterator, cụ thể là CheckpointCloseableIterable của các đối tượng IdentityGroup. Bạn có thể sử dụng lớp CheckpointClosableIterableImpl.Builder để tạo và trả về một biến lặp. Đoạn mã sau đây cho biết cách đóng gói từng nhóm và thành viên thành một danh sách, đồng thời tạo trình lặp từ danh sách đó:

IdentityConnectorSample.java
CheckpointCloseableIterable<IdentityGroup> iterator =
   new CheckpointCloseableIterableImpl.Builder<IdentityGroup>(groups)
      .setHasMore(false)
      .setCheckpoint((byte[])null)
      .build();

Các bước tiếp theo

Dưới đây là một vài bước tiếp theo bạn có thể thực hiện:

  • (không bắt buộc) Triển khai phương thức close() để giải phóng mọi tài nguyên trước khi tắt.
  • (không bắt buộc) Tạo trình kết nối nội dung bằng SDK trình kết nối nội dung.