Kimlik bağlayıcı oluşturma

Varsayılan olarak Google Cloud Search yalnızca Google Cloud Directory'de depolanan Google kimliklerini (kullanıcılar 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ştirme konusunda aşağıdaki seçenekleri sunar:

  • Kimlik Bağlayıcı SDK'sı. Bu seçenek, Java programlama dilinde programlama yapan geliştiriciler içindir. Kimlik bağlayıcı SDK, REST API'nin sarmalayıcısıdır ve bağlayıcıları hızlı bir şekilde oluşturmanıza olanak tanı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üzeyli bir REST API ve API kitaplıkları. Bu seçenekler, Java ile programlamayan veya kod tabanı REST API'yi ya da kitaplığı daha iyi destekleyen 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, grupları eşleme hakkında bilgi edinmek üzere Cloud Identity Belgeleri'ne bakın.

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

Tipik bir kimlik bağlayıcısı aşağıdaki görevleri yerine getirir:

  1. Bağlayıcıyı yapılandırın.
  2. Kurumsal kimlik sisteminizdeki tüm kullanıcıları alın ve Google kimlikleriyle senkronize etmek için Google'a gönderin.
  3. Kurumsal kimlik sisteminizdeki tüm grupları alıp Google kimlikleriyle senkronize edilmek üzere 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, tüm bağlayıcılar tarafından kullanılan, 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 bildirmeniz gerekir:

  • İçerik bağlayıcı için api.sourceId ve api.serviceAccountPrivateKeyFile parametrelerini bildirmeniz gerekir. Bu parametreler, deponuzun konumunu ve depoya erişmek için gereken özel anahtarı tanımlar.
  • Kimlik bağlayıcı için api.identitySourceId değerini belirtmeniz gerekir. Bu parametre, harici kimlik kaynağınızın konumunu tanımlar. Kullanıcıları senkronize ediyorsanız api.customerId değerini de kuruluşunuzun Google Workspace hesabının benzersiz kimliği olarak beyan etmeniz 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 (ör. belirli kimliklerin ve anahtarların nasıl oluşturulacağı) hakkında daha fazla bilgi için Google tarafından sağlanan yapılandırma parametreleri başlıklı makaleyi inceleyin.

Yapılandırma dosyanızda kullanmak üzere kendi depoya özel parametrelerinizi de tanımlayabilirsiniz.

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

Yapılandırma dosyasını bağlayıcınıza iletmek için config sistem özelliğini ayarlayın. Bağlayıcı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

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

Dokümanların bu bölümünde, IdentityConnecorSample.java örneğindeki kod snippet'lerine atıfta bulunulmaktadır. Bu örnek, kullanıcı ve grup kimliklerini iki CSV dosyasından okur ve 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 temel görevi, Application sınıfının bir örneğini oluşturmak ve bağlayıcıyı çalıştırmak için start() yöntemini çağırmaktır.

Çağırmadan önce application.start(), FullSyncIdentityConnector şablonunu örneklemek için IdentityApplication.Builder sınıfını kullanın. FullSyncIdentityConnector, yöntemlerini uygulayacağınız bir Repository nesnesini 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, bağlayıcınızın main() yöntemi Application.build yöntemini çağırdıktan sonra SDK, initConfig() yöntemini çağırır. initConfig() yöntemi aşağıdaki görevleri gerçekleştirir:

  1. Configuation.isInitialized() yöntemini çağırarak Configuration öğesinin başlatılmadığından emin olur.
  2. Google tarafından sağlanan anahtar/değer çiftleriyle bir Configuration nesnesini başlatır. Her anahtar/değer çifti, Configuration nesnesi içindeki bir ConfigValue nesnesinde depolanır.

Repository arayüzünü uygulama

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

  • init() yöntemi. Kimlik deposu kurulumu ve başlatma işlemlerini 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.

  • (İsteğe bağlı) close() yöntemi. Depo temizliği yapmanız 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ğlayıcınızın yapılandırmasını işleme sürecinde, Configuration nesnesinden tüm özel parametreleri almanız gerekir. Bu görev genellikle bir Repository sınıfının init() yönteminde gerçekleştirilir.

Configuration sınıfı, yapılandırmadan farklı veri türlerini almak için çeşitli yöntemlere sahiptir. 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ğerinin 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çalar halinde ayrıştırmak üzere Configuration sınıfının tür ayrıştırıcılarından birini kullanın. Eğitim amaçlı bağlayıcıdan alınan aşağıdaki snippet, GitHub depo adlarının listesini almak için getMultiValue yöntemini kullanı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() geçersiz kılın. listUsers() yöntemi, senkronize edilecek son kimliği temsil eden bir kontrol noktası kabul eder. İşlem kesintiye uğrarsa senkronizasyonu devam ettirmek için kontrol noktası kullanılabilir. Deponuzdaki her kullanıcı için listUsers() yönteminde şu adımları uygulayacaksı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 yineleyiciye paketleyin.

Kullanıcı eşlemesi alma

Aşağıdaki kod snippet'inde, bir 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 yineleyiciye paketleme

listUsers() yöntemi, IdentityUser nesnelerinin Iterator'ünü, özellikle de CheckpointCloseableIterable'i döndürür. Yineleyici 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 paketleneceği ve bu listeden yineleyicinin nasıl oluşturulacağı gösterilmektedir:

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

Grup alma

Kimlik deposundaki tüm grupları ve üyelerini almak için listGroups() geçersiz kılın. listGroups() yöntemi, senkronize edilecek son kimliği temsil eden bir kontrol noktası kabul eder. İşlem kesintiye uğrarsa senkronizasyonu devam ettirmek için kontrol noktası kullanılabilir. Deponuzdaki her kullanıcı için listGroups() yönteminde şu adımları uygulayacaksınız:

  1. Grubu ve üyelerini alır.
  2. Her grubu ve üyeleri, listGroups() yöntemi tarafından döndürülen bir yineleyiciye 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 yineleyiciye paketleme

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

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

Sonraki Adımlar

İzleyebileceğiniz bazı sonraki adımlar:

  • (İsteğe bağlı) Kapatmadan önce kaynakları serbest bırakmak için close() yöntemini uygulayın.
  • (İsteğe bağlı) Content Connector SDK'yı kullanarak içerik bağlayıcı oluşturun.