একটি পরিচয় সংযোগকারী তৈরি করুন

ডিফল্টরূপে, গুগল ক্লাউড সার্চ শুধুমাত্র গুগল ক্লাউড ডিরেক্টরিতে থাকা গুগল আইডেন্টিটিগুলোকেই শনাক্ত করে। ক্লাউড সার্চ যে গুগল আইডেন্টিটিগুলো ব্যবহার করে, সেগুলোর সাথে এন্টারপ্রাইজ আইডেন্টিটিগুলোকে সিঙ্ক করতে আইডেন্টিটি কানেক্টর ব্যবহার করুন।

আইডেন্টিটি কানেক্টর তৈরির জন্য গুগল এই বিকল্পগুলো প্রদান করে:

আইডেন্টিটি কানেক্টর এসডিকে ব্যবহার করে একটি আইডেন্টিটি কানেক্টর তৈরি করুন।

একটি সাধারণ আইডেন্টিটি কানেক্টর নিম্নলিখিত কাজগুলো সম্পাদন করে:

  1. কানেক্টরটি কনফিগার করে।
  2. আপনার পরিচয় ব্যবস্থা থেকে ব্যবহারকারীদের সংগ্রহ করে গুগলে পাঠায়।
  3. আপনার পরিচয় ব্যবস্থা থেকে গ্রুপগুলো সংগ্রহ করে গুগলে পাঠায়।

নির্ভরতা সেট আপ করুন

আপনার বিল্ড ফাইলে এই নির্ভরতাগুলো অন্তর্ভুক্ত করুন।

ম্যাভেন

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

গ্রেডল

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

আপনার সংযোগকারী কনফিগারেশন তৈরি করুন

প্রতিটি কানেক্টর আপনার রিপোজিটরি আইডির মতো প্যারামিটারগুলোর জন্য একটি কনফিগারেশন ফাইল ব্যবহার করে। প্যারামিটারগুলোকে কী-ভ্যালু পেয়ার হিসেবে সংজ্ঞায়িত করুন, যেমন api.sourceId= 1234567890abcdef

গুগল ক্লাউড সার্চ এসডিকে-তে সকল কানেক্টরের জন্য গুগল-প্রদত্ত প্যারামিটার অন্তর্ভুক্ত রয়েছে। আপনাকে আপনার কনফিগারেশন ফাইলে নিম্নলিখিতগুলি অবশ্যই ঘোষণা করতে হবে:

  • কন্টেন্ট কানেক্টর : api.sourceId এবং api.serviceAccountPrivateKeyFile ঘোষণা করুন। এগুলো আপনার রিপোজিটরি এবং অ্যাক্সেসের জন্য প্রয়োজনীয় প্রাইভেট কী শনাক্ত করে।
  • আইডেন্টিটি কানেক্টর : আপনার বাহ্যিক আইডেন্টিটি সোর্স শনাক্ত করতে api.identitySourceId ডিক্লেয়ার করুন। ইউজার সিঙ্কিংয়ের জন্য, api.customerId (আপনার গুগল ওয়ার্কস্পেস অ্যাকাউন্টের ইউনিক আইডি) ডিক্লেয়ার করুন।

অন্যান্য গুগল-প্রদত্ত প্যারামিটারগুলো শুধুমাত্র তাদের ডিফল্ট মান ওভাররাইড করার জন্য ঘোষণা করুন। আইডি এবং কী তৈরি করার বিষয়ে বিস্তারিত জানতে, গুগল-প্রদত্ত প্যারামিটারসমূহ দেখুন।

আপনি আপনার কনফিগারেশন ফাইলে রিপোজিটরি-নির্দিষ্ট প্যারামিটারও নির্ধারণ করতে পারেন।

কনফিগারেশন ফাইলটি কানেক্টরের কাছে পাঠান।

কনফিগারেশন ফাইলটি পাস করার জন্য config সিস্টেম প্রপার্টি সেট করুন। কানেক্টরটি চালু করার সময় -D আর্গুমেন্টটি ব্যবহার করুন। উদাহরণস্বরূপ:

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

আপনি যদি এই আর্গুমেন্টটি বাদ দেন, তাহলে SDK স্থানীয় ডিরেক্টরিতে থাকা connector-config.properties নামের ফাইলটি ব্যবহার করার চেষ্টা করে।

একটি টেমপ্লেট ক্লাস ব্যবহার করে একটি সম্পূর্ণ সিঙ্ক আইডেন্টিটি কানেক্টর তৈরি করুন।

আপনার রিপোজিটরি থেকে সমস্ত ব্যবহারকারী এবং গ্রুপ সিঙ্ক করার জন্য SDK-তে একটি FullSyncIdentityConnector টেমপ্লেট অন্তর্ভুক্ত রয়েছে। এই বিভাগে এটি কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করা হয়েছে।

এই অংশে IdentityConnectorSample.java স্যাম্পলের কোড উল্লেখ করা হয়েছে, যা CSV ফাইল থেকে পরিচয়পত্র পড়ে।

কানেক্টর এন্ট্রি পয়েন্ট বাস্তবায়ন করুন

এন্ট্রি পয়েন্ট হলো main() মেথড। এটি একটি Application ইনস্ট্যান্স তৈরি করে এবং কানেক্টরটি চালানোর জন্য start() মেথডকে কল করে।

application.start() কল করার আগে, IdentityApplication.Builder ব্যবহার করে FullSyncIdentityConnector টেমপ্লেটটি ইনস্ট্যানশিয়েট করুন।

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();
}

আপনার main() মেথড Application.build() কল করার পর SDK, initConfig() কল করে। initConfig() মেথডটি হলো:

  1. Configuration আগে থেকেই প্রারম্ভিক অবস্থায় নেই তা নিশ্চিত করে।
  2. গুগল-প্রদত্ত কী-ভ্যালু পেয়ার দিয়ে Configuration অবজেক্টটি ইনিশিয়ালাইজ করে।

রিপোজিটরি ইন্টারফেস বাস্তবায়ন করুন

Repository অবজেক্টটি রিপোজিটরি আইডেন্টিটিগুলোকে গুগল আইডেন্টিটির সাথে সিঙ্ক করে। একটি টেমপ্লেট ব্যবহার করার সময়, আপনাকে শুধুমাত্র নির্দিষ্ট কিছু মেথড ওভাররাইড করতে হবে। FullSyncIdentityConnector জন্য, এই মেথডগুলো ওভাররাইড করুন:

  • init() : সেটআপ এবং প্রারম্ভিককরণের জন্য।
  • listUsers() : সকল ব্যবহারকারীকে সিঙ্ক করার জন্য।
  • listGroups() : সকল গ্রুপ সিঙ্ক করার জন্য।
  • (ঐচ্ছিক) close() : শাটডাউনের সময় পরিষ্কার-পরিচ্ছন্নতার জন্য।

কাস্টম কনফিগারেশন প্যারামিটার পান

Configuration অবজেক্ট থেকে কাস্টম প্যারামিটারগুলো পুনরুদ্ধার করুন, সাধারণত init() মেথডের মাধ্যমে। নিচের কোড স্নিপেটটিতে দেখানো হয়েছে কিভাবে CSV পাথগুলো পুনরুদ্ধার করতে হয়:

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();
}

একাধিক মান ধারণকারী কোনো প্যারামিটার পেতে ও পার্স করতে, ডেটাটিকে আলাদা আলাদা খণ্ডে পার্স করার জন্য Configuration ক্লাসের টাইপ পার্সারগুলোর মধ্যে একটি ব্যবহার করুন। টিউটোরিয়াল কানেক্টর থেকে নেওয়া নিম্নলিখিত কোড স্নিপেটটি, GitHub রিপোজিটরি নামগুলোর একটি তালিকা পেতে getMultiValue মেথডটি ব্যবহার করে:

গিটহাবরিপোজিটরি.জাভা
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

সকল ব্যবহারকারীর জন্য ম্যাপিং পান

ব্যবহারকারী ম্যাপিং পুনরুদ্ধার করতে listUsers() মেথডটি ওভাররাইড করুন। সিঙ্কিং বাধাগ্রস্ত হলে তা পুনরায় শুরু করার জন্য এই মেথডটি একটি চেকপয়েন্ট গ্রহণ করে। প্রতিটি ব্যবহারকারীর জন্য:

  1. গুগল আইডেন্টিটি এবং এক্সটার্নাল আইডেন্টিটির মধ্যেকার ম্যাপিংটি বের করুন।
  2. listUsers() দ্বারা ফেরত আসা ইটারেটরের মধ্যে জোড়াটিকে প্যাকেজ করুন।

ব্যবহারকারী ম্যাপিং পান

এই কোড স্নিপেটটি একটি 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);
    }
  }
  // ...
}

একটি ব্যবহারকারী ম্যাপিংকে ইটারেটরের মধ্যে প্যাকেজ করুন

listUsers() মেথডটি IdentityUser অবজেক্টের একটি CheckpointCloseableIterable রিটার্ন করে।

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

একটি দল গঠন করুন

গ্রুপ এবং তাদের সদস্যদের পুনরুদ্ধার করতে listGroups() মেথডটি ওভাররাইড করুন। এই মেথডটি একটি চেকপয়েন্ট গ্রহণ করে। প্রতিটি গ্রুপের জন্য:

  1. গ্রুপটি এবং এর সদস্যদের খুঁজে বের করুন।
  2. listGroups() দ্বারা ফেরত আসা ইটারেটরের মধ্যে সেগুলোকে প্যাকেজ করুন।

গোষ্ঠীর পরিচয় জানুন

এই কোড স্নিপেটটি একটি 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);
    }
  }
  // ...

}

গ্রুপ এবং সদস্যদের একটি ইটারেটরে প্যাকেজ করুন

listGroups() মেথডটি IdentityGroup অবজেক্টের একটি CheckpointCloseableIterable রিটার্ন করে।

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

পরবর্তী পদক্ষেপ