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

Theo mặc định, Google Cloud Search chỉ nhận dạng các 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ộ hoá danh tính của doanh nghiệp với danh tính trên Google mà Google Cloud Search sử dụng.

Google cung cấp các phương á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. Lựa chọn này dành cho các nhà phát triển đang 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, giúp bạn nhanh chóng tạo trình kết nối. Để tạo một trình kết nối danh tính bằng SDK, hãy tham khảo 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 cấp thấp. Đây là những lựa chọn dành cho các nhà phát triển có thể không được lập trình bằng Java hoặc có cơ sở mã phù hợp hơn với REST API hoặc một thư viện. Để tạo trình kết nối danh tính bằng API REST, hãy tham khảo đến Directory API: User Account (API thư mục: Tài khoản người dùng) cho về việc liên kết người dùng và Tài liệu về Cloud Identity dành cho 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 của doanh nghiệp và gửi họ tới Google để đồng bộ hoá với thông tin nhận dạng Google.
  3. Truy xuất tất cả các nhóm từ hệ thống thông tin nhận dạng của doanh nghiệp rồi gửi tới Google để đồng bộ hoá với thông tin nhận dạng 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. Nhấp chuột trên thẻ dưới đây để xem các phần phụ thuộc cho môi trường tạo bản dựng:

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 thông số được sử dụng bởi trình kết nối, chẳng hạn như mã nhận dạng cho kho lưu trữ của bạn. Các thông số được định nghĩa là các cặp khoá-giá trị, chẳng hạn như api.sourceId=1234567890abcdef.

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

  • Đối với trình kết nối nội dung, bạn phải khai báo api.sourceIdapi.serviceAccountPrivateKeyFile vì những thông số này xác định vị trí kho lưu trữ và khoá riêng tư cần thiết để truy cập 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 là trình kết nối danh tính thông số này xác định vị trí của nguồn nhận dạng bên ngoài. Nếu bạn khi đồ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.

Trừ phi bạn muốn ghi đè các giá trị mặc định của các nền tảng khác do Google cung cấp tham số, bạn không cần khai báo chúng trong tệp cấu hình. Để biết thêm thông tin về các thông 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 Các thông 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 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 vào trình kết nối. Bạn có thể đặt thuộc tính này bằng cách sử dụng đối số -D khi bắt đầu trình kết nối. Ví dụ: lệnh sau đây sẽ khởi động trình kết nối với 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 thì SDK cố gắng truy cập cấu hình mặc định tệp 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 bạn có thể dùng để đồng bộ hoá tất cả người dùng và nhóm trong mã nhận dạng kho lưu trữ có danh tính 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 danh tính không phải của Google kho lưu trữ.

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

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

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

Trước khi gọi application.start()! sử dụng IdentityApplication.Builder để tạo thực thể Mẫu FullSyncIdentityConnector. FullSyncIdentityConnector chấp nhận một Repository mà 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();
}

Đằng sau đó, SDK gọi initConfig() sau khi phương thức main() của trình kết nối được gọi Application.build. Phương thức initConfig() thực hiện các tác vụ sau:

  1. Gọi hàm Configuation.isInitialized() để đảm bảo rằng Configuration chưa được khởi chạy.
  2. Khởi động đối tượng Configuration bằng khoá-giá trị do Google cung cấp cặp. Mỗi cặp khoá-giá trị được lưu trữ trong một ConfigValue trong đố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 danh tính Google. Khi sử dụng một 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:

  • Chiến lược phát hành đĩa đơn init() . Để thiết lập và khởi chạy kho lưu trữ danh tính, hãy ghi đè phương thức `init().

  • Chiến lược phát hành đĩa đơn 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().

  • Chiến lược phát hành đĩa đơn listGroups() . Cách đồng bộ hoá tất cả các nhóm trong kho lưu trữ danh tính với Google Groups: ghi đè phương thức listGroups().

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

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 tải mọi thông số tùy chỉnh từ Configuration . Tác vụ này thường được thực hiện trong Repository của lớp init() .

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 ConfigValue . Sau đó, bạn sẽ sử dụng mã của đối tượng ConfigValue get() để truy xuất giá trị thực. Đoạn mã sau đây cho biết cách truy xuất userMappingCsvPath và Giá trị groupMappingCsvPath 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();
}

Để tải 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 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 đoạn riêng biệt. Đoạn mã sau đây, từ trình kết nối hướng dẫn, sử dụng 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 bản đồ cho tất cả người dùng

Ghi đè listUsers() để truy xuất bản đồ ánh xạ cho tất cả người dùng từ kho lưu trữ danh tính của bạn. Chiến lược phát hành đĩa đơn Phương thức listUsers() chấp nhận một điểm kiểm tra đại diện cho danh tính mới nhất đã đồng bộ hoá. Bạn có thể dùng điểm kiểm tra đó để tiếp tục quá trình đồng bộ hoá nếu quá trình này 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 này trong phương thức listUsers():

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

Tải bản đồ người dùng

Đoạn mã sau đây minh hoạ cách truy xuất các mục ánh xạ 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 bản đồ ánh xạ người dùng vào một đối tượng lặp

listUsers() trả về một Iterator, cụ thể là một CheckpointCloseableIterable! trong số IdentityUser . Bạn có thể sử dụng 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 xạ vào danh sách, hãy tạo biến lặp từ đó danh sách:

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

Tạo nhóm

Ghi đè listGroups() để truy xuất tất cả các nhóm và thành viên trong các nhóm đó từ danh tính của bạn kho lưu trữ. Phương thức listGroups() chấp nhận một điểm kiểm tra đại diện cho danh tính cần đồng bộ hoá. Điểm kiểm tra đó có thể được dùng để tiếp tục quá trình đồng bộ hoá nếu 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 những quy tắc này các bước trong phương thức listGroups():

  1. Xem nhóm và các thành viên trong nhóm.
  2. Đóng gói từng nhóm và các thành viên vào một biến lặp do listGroups().

Lấy thông tin nhận dạng 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

listGroups() trả về một Iterator, cụ thể là một CheckpointCloseableIterable! trong số IdentityGroup . Bạn có thể sử dụng 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à các thành viên vào một danh sách rồi tạo biến 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 close() để giải phóng bất kỳ tài nguyên nào trước khi tắt.
  • (không bắt buộc) Tạo trình kết nối nội dung thông qua SDK Trình kết nối nội dung.