Kimlik bağlayıcı oluşturma

Google Cloud Search varsayılan olarak yalnızca Google Cloud Directory'de depolanan Google kimliklerini (kullanıcı ve gruplar) tanır. Kimlik bağlayıcıları, kuruluşunuzun kimliklerini Google Cloud Search tarafından kullanılan Google kimlikleriyle senkronize etmek için kullanılır.

Google, kimlik bağlayıcıları geliştirmek için aşağıdaki seçenekleri sunar:

  • Identity Connector SDK'sı. Bu seçenek, Java programlama dilinde programlama yapan geliştiriciler içindir. Identity Connector SDK'sı, REST API'yi sarmalayan ve hızlıca bağlayıcı oluşturmanıza olanak tanıyan bir sarmalayıcıdır. SDK'yı kullanarak kimlik bağlayıcı oluşturmak için Identity Connector SDK'sını kullanarak kimlik bağlayıcı oluşturma başlıklı makaleyi inceleyin.

  • Düşük düzey REST API ve API kitaplıkları. Bu seçenekler, Java'da programlama yapmayan veya kod tabanı REST API'yi ya da kitaplığı daha iyi barındıran geliştiriciler içindir. REST API'yi kullanarak kimlik bağlayıcı oluşturmak için kullanıcıları eşleme hakkında bilgi edinmek üzere Directory API: User Accounts (Dizin API'si: Kullanıcı Hesapları) bölümüne, grupları eşleme hakkında bilgi edinmek için ise Cloud Identity Dokümanları'na bakın.

Identity Connector SDK'sını kullanarak kimlik bağlayıcısı oluşturma

Tipik bir kimlik bağlayıcı aşağıdaki görevleri gerçekleştirir:

  1. Bağlayıcıyı yapılandırın.
  2. Tüm kullanıcıları kurumsal kimlik sisteminizden alın ve Google kimlikleriyle senkronize edilmeleri için Google'a gönderin.
  3. Tüm grupları kurumsal kimlik sisteminizden alın ve Google kimlikleriyle senkronize edilmeleri için Google'a gönderin.

Bağımlılıkları ayarlama

SDK'yı kullanmak için derleme dosyanıza belirli bağımlılıklar eklemeniz gerekir. Derleme ortamınızın bağımlılıklarını görüntülemek için aşağıdaki sekmelerden birini tıklayı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'

Bağlayıcı yapılandırmanızı oluşturun

Her bağlayıcının, bağlayıcı tarafından kullanılan parametreleri (ör. deponuzun kimliği) içeren bir yapılandırma dosyası vardır. Parametreler, api.sourceId=1234567890abcdef gibi anahtar/değer çiftleri olarak tanımlanır.

Google Cloud Search SDK'sı, tüm bağlayıcılar tarafından kullanılan ve Google tarafından sağlanan çeşitli yapılandırma parametreleri içerir. Yapılandırma dosyanızda Google tarafından sağlanan aşağıdaki parametreleri belirtmeniz gerekir:

  • İçerik bağlayıcı için api.sourceId ve api.serviceAccountPrivateKeyFile parametrelerini belirtmeniz gerekir. Bu parametreler, deponuzun konumunu ve depoya erişmek için gereken özel anahtarı tanımlar.
  • Kimlik bağlayıcısı için api.identitySourceId parametresini belirtmeniz gerekir. Bu parametre, harici kimlik kaynağınızın konumunu tanımlar. Kullanıcıları senkronize ediyorsanız kuruluşunuzun Google Workspace hesabı için benzersiz kimlik olarak api.customerId değerini de belirtmeniz gerekir.

Google tarafından sağlanan diğer parametrelerin varsayılan değerlerini geçersiz kılmak istemiyorsanız bunları yapılandırma dosyanızda belirtmeniz gerekmez. Google tarafından sağlanan yapılandırma parametreleri hakkında ek bilgi (ör. belirli kimliklerin ve anahtarların nasıl oluşturulacağı) için Google tarafından sağlanan yapılandırma parametreleri başlıklı makaleyi inceleyin.

Ayrıca, yapılandırma dosyanızda kullanmak üzere kendi depoya özgü parametrelerinizi de tanımlayabilirsiniz.

Yapılandırma dosyasını bağlayıcıya iletin

Yapılandırma dosyasını bağlayıcınıza iletmek için config sistem özelliğini ayarlayın. Bağlantıyı başlatırken -D bağımsız değişkenini kullanarak mülkü ayarlayabilirsiniz. Örneğin, aşağıdaki komut bağlayıcıyı MyConfig.properties yapılandırma dosyasıyla başlatır:

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

Bu bağımsız değişken eksikse SDK, connector-config.properties adlı varsayılan bir yapılandırma dosyasına erişmeye çalışır.

Şablon sınıfı kullanarak tam senkronizasyon kimlik bağlayıcısı oluşturma

Identity Connector SDK'sı, kimlik deposundaki tüm kullanıcıları ve grupları Google kimlikleriyle senkronize etmek için kullanabileceğiniz bir FullSyncIdentityConnector şablon sınıfı içerir. Bu bölümde, Google dışı bir kimlik deposundaki kullanıcı ve grupların tam senkronizasyonunu gerçekleştirmek için FullSyncIdentityConnector şablonunun nasıl kullanılacağı açıklanmaktadır.

Belgelerin bu bölümünde, IdentityConnecorSample.java örneğindeki kod snippet'leri ele alınmaktadır. Bu örnek, iki CSV dosyasından kullanıcı ve grup kimliklerini okur ve bunları Google kimlikleriyle senkronize eder.

Bağlayıcının giriş noktasını uygulama

Bir bağlayıcının giriş noktası main() yöntemidir. Bu yöntemin birincil görevi, Application sınıfının bir örneğini oluşturmak ve bağlayıcıyı çalıştırmak için sınıfın start() yöntemini çağırmaktır.

application.start() işlevini çağırmadan önce, FullSyncIdentityConnector şablonunu örneklemek için IdentityApplication.Builder sınıfını kullanın. FullSyncIdentityConnector, yöntemlerini uygulayacağınız bir Repository nesnesi kabul eder. Aşağıdaki kod snippet'inde, main() yönteminin nasıl uygulanacağı gösterilmektedir:

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

Arka planda, SDK, bağlayıcınızın main() yöntemi Application.build çağrısından sonra initConfig() yöntemini çağırır. initConfig() yöntemi aşağıdaki görevleri gerçekleştirir:

  1. Configuration sınıfının başlatılmadığından emin olmak için Configuation.isInitialized() yöntemini çağırır.
  2. Google tarafından sağlanan anahtar/değer çiftleriyle bir Configuration nesnesini başlatır. Her anahtar/değer çifti, Configuration nesnesinde bir ConfigValue nesnesine depolanır.

Repository arayüzünü uygulama

Repository nesnesinin tek amacı, depolama alanı kimliklerinin Google kimlikleriyle senkronizasyonunu gerçekleştirmektir. Şablon kullanırken kimlik bağlayıcı oluşturmak için yalnızca Repository arayüzündeki belirli yöntemleri geçersiz kılmanız gerekir. FullTraversalConnector için muhtemelen aşağıdaki yöntemleri geçersiz kılarsınız:

  • init() yöntemi. Kimlik deposu kurulumunu ve ilklendirmesini gerçekleştirmek için "init()" yöntemini geçersiz kılın.

  • listUsers() yöntemi. Kimlik deposundaki tüm kullanıcıları Google kullanıcılarıyla senkronize etmek için listUsers() yöntemini geçersiz kılın.

  • listGroups() yöntemi. Kimlik deposundaki tüm grupları Google Gruplar ile senkronize etmek için listGroups() yöntemini geçersiz kılın.

  • (isteğe bağlı) close() yöntemi. Depoyu temizlemeniz gerekiyorsa close() yöntemini geçersiz kılın. Bu yöntem, bağlayıcı kapatılırken bir kez çağrılır.

Özel yapılandırma parametrelerini alma

Bağlantıcınızın yapılandırmasını işleme kapsamında, tüm özel parametreleri Configuration nesnesinden almanız gerekir. Bu görev genellikle bir Repository sınıfının init() yönteminde gerçekleştirilir.

Configuration sınıfında, bir yapılandırmadan farklı veri türleri elde etmek için çeşitli yöntemler bulunur. Her yöntem bir ConfigValue nesnesi döndürür. Ardından, gerçek değeri almak için ConfigValue nesnesinin get() yöntemini kullanırsınız. Aşağıdaki snippet'te, bir Configuration nesnesinden userMappingCsvPath ve groupMappingCsvPath değerlerinin nasıl alınacağı gösterilmektedir:

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

Birden fazla değer içeren bir parametreyi almak ve ayrıştırmak için verileri ayrı parçalara ayırmak üzere Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim bağlayıcısından alınan aşağıdaki snippet'te, GitHub depo adlarının listesini almak için getMultiValue yöntemi kullanılır:

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

Tüm kullanıcılar için eşlemeyi alma

Kimlik deponuzdaki tüm kullanıcıların eşlemesini almak için listUsers() seçeneğini geçersiz kılın. listUsers() yöntemi, senkronize edilecek son kimliği temsil eden bir kontrol noktasını kabul eder. Bu kontrol noktası, süreç kesintiye uğrarsa senkronizasyonu devam ettirmek için kullanılabilir. Deponuzdaki her kullanıcı için listUsers() yönteminde aşağıdaki adımları uygularsınız:

  1. Google kimliği ve ilişkili harici kimlikten oluşan bir eşleme alın.
  2. Çifti, listUsers() yöntemi tarafından döndürülen bir iteratöre paketleyin.

Kullanıcı eşlemesi alma

Aşağıdaki kod snippet'inde, CSV dosyasında depolanan kimlik eşlemelerinin nasıl alınacağı gösterilmektedir:

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

Kullanıcı eşlemesini bir iteratöre paketleme

listUsers() yöntemi, IdentityUser nesnelerinden oluşan bir Iterator (özellikle CheckpointCloseableIterable) döndürür. Bir iteratör oluşturmak ve döndürmek için CheckpointClosableIterableImpl.Builder sınıfını kullanabilirsiniz. Aşağıdaki kod snippet'inde, her eşlemenin nasıl bir liste halinde paketleneceği ve bu listeden iteratör oluşturulacağı gösterilmektedir:

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

Grup alma

Tüm grupları ve üyelerini kimlik deponuzdan almak için listGroups() değerini geçersiz kılın. listGroups() yöntemi, senkronize edilecek son kimliği temsil eden bir kontrol noktasını kabul eder. Bu kontrol noktası, süreç kesintiye uğrarsa senkronizasyonu devam ettirmek için kullanılabilir. Deponuzdaki her kullanıcı için listGroups() yönteminde aşağıdaki adımları uygularsınız:

  1. Grubu ve üyelerini alın.
  2. Her grubu ve üyeleri listGroups() yöntemi tarafından döndürülen bir iteratöre paketleyin.

Grup kimliğini alma

Aşağıdaki kod snippet'inde, CSV dosyasında depolanan grupların ve üyelerin nasıl alınacağı gösterilmektedir:

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

}

Grubu ve üyeleri bir iteratöre paketleme

listGroups() yöntemi, IdentityGroup nesnelerinden oluşan bir Iterator (özellikle CheckpointCloseableIterable) döndürür. Bir iteratör oluşturmak ve döndürmek için CheckpointClosableIterableImpl.Builder sınıfını kullanabilirsiniz. Aşağıdaki kod snippet'inde, her grubun ve üyelerin bir listede nasıl paketleneceği ve iteratörünün bu listeden nasıl oluşturulacağı gösterilmektedir:

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

Sonraki Adımlar

Aşağıda, uygulayabileceğiniz birkaç adım verilmiştir:

  • (isteğe bağlı) Kapatma işleminden önce tüm kaynakları serbest bırakmak için close() yöntemini uygulayın.
  • (isteğe bağlı) Content Connector SDK'sını kullanarak içerik bağlayıcı oluşturun.