Identitätsconnector erstellen

Standardmäßig werden von Google Cloud Search nur Google-Identitäten im Google Cloud-Verzeichnis erkannt. Verwenden Sie Identitätsconnectors , um Unternehmensidentitäten mit den Google-Identitäten zu synchronisieren, die von Cloud Search verwendet werden.

Google bietet Ihnen die folgenden Möglichkeiten, Identitätsconnectors zu entwickeln:

Mit dem Identity Connector SDK einen Identitätsconnector erstellen

Ein typischer Identitätsconnector führt die folgenden Aufgaben aus:

  1. Er konfiguriert den Connector.
  2. Er ruft Nutzer aus Ihrem Identitätssystem ab und sendet sie an Google.
  3. Er ruft Gruppen aus Ihrem Identitätssystem ab und sendet sie an Google.

Abhängigkeiten einrichten

Fügen Sie diese Abhängigkeiten in Ihre Build-Datei ein.

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'

Connector-Konfiguration erstellen

Jeder Connector verwendet eine Konfigurationsdatei für Parameter wie Ihre Repository-ID. Definieren Sie Parameter als Schlüssel/Wert Paare, z. B. api.sourceId=1234567890abcdef.

Das Google Cloud Search SDK enthält von Google bereitgestellte Parameter für alle Connectors. Sie müssen Folgendes in Ihrer Konfigurationsdatei deklarieren:

  • Inhaltsconnector: Deklarieren Sie api.sourceId und api.serviceAccountPrivateKeyFile. Diese Parameter geben Ihr Repository und den für den Zugriff erforderlichen privaten Schlüssel an.
  • Identitätsconnector: Deklarieren Sie api.identitySourceId, um Ihre externe Identitätsquelle anzugeben. Für die Nutzersynchronisierung deklarieren Sie auch api.customerId (die eindeutige ID für Ihr Google Workspace-Konto).

Deklarieren Sie andere von Google bereitgestellte Parameter nur, um ihre Standardwerte zu überschreiben. Weitere Informationen zum Generieren von IDs und Schlüsseln finden Sie unter Von Google bereitgestellte Parameter.

Sie können auch Repository-spezifische Parameter in Ihrer Konfigurationsdatei definieren.

Konfigurationsdatei an den Connector übergeben

Legen Sie das Systemattribut config fest, um die Konfigurationsdatei zu übergeben. Verwenden Sie das Argument -D, wenn Sie den Connector starten. Beispiel:

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

Wenn Sie dieses Argument weglassen, versucht das SDK, eine Datei mit dem Namen connector-config.properties im lokalen Verzeichnis zu verwenden.

Mit einer Vorlagenklasse einen Identitätsconnector für eine vollständige Synchronisierung erstellen

Das SDK enthält die Vorlage FullSyncIdentityConnector, mit der Sie alle Nutzer und Gruppen aus Ihrem Repository synchronisieren können. In diesem Abschnitt wird die Verwendung der Vorlage erläutert.

Dieser Abschnitt bezieht sich auf Code aus dem Beispiel IdentityConnectorSample.java, in dem Identitäten aus CSV-Dateien gelesen werden.

Einstiegspunkt des Connectors implementieren

Der Einstiegspunkt ist die Methode main(). Sie erstellt eine Application Instanz und ruft start() auf, um den Connector auszuführen.

Verwenden Sie IdentityApplication.Builder um die FullSyncIdentityConnector Vorlage zu instanziieren, bevor Sie application.start() aufrufen.

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

Das SDK ruft initConfig() auf, nachdem Ihre Methode main() Application.build() aufgerufen hat. Die Methode initConfig():

  1. Stellt sicher, dass die Configuration nicht bereits initialisiert wurde.
  2. Initialisiert das Configuration-Objekt mit von Google bereitgestellten Schlüssel/Wert-Paaren.

Repository-Oberfläche implementieren

Das Repository-Objekt synchronisiert Repository-Identitäten mit Google-Identitäten. Wenn Sie eine Vorlage verwenden, müssen Sie nur bestimmte Methoden überschreiben. Überschreiben Sie für FullSyncIdentityConnector die folgenden Methoden:

  • init(): Für Einrichtung und Initialisierung.
  • listUsers(): Zum Synchronisieren aller Nutzer.
  • listGroups(): Zum Synchronisieren aller Gruppen.
  • Optional: close(): Für die Bereinigung beim Herunterfahren.

Benutzerdefinierte Konfigurationsparameter abrufen

Rufen Sie benutzerdefinierte Parameter aus dem Configuration-Objekt ab, in der Regel in der Methode init(). Das folgende Snippet zeigt, wie Sie CSV-Pfade abrufen:

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

Wenn Sie einen Parameter mit mehreren Werten abrufen und parsen möchten, verwenden Sie einen der Typparser der Klasse Configuration, um die Daten in separate Teile zu parsen. Das folgende Snippet aus dem Connectorbeispiel des Tutorials zeigt, wie Sie mithilfe der getMultiValue Methode eine Liste mit Namen von GitHub-Repositories erhalten:

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

Zuordnung für alle Nutzer abrufen

Überschreiben Sie listUsers(), um Nutzerzuordnungen abzurufen. Diese Methode akzeptiert einen Prüfpunkt, um die Synchronisierung bei einer Unterbrechung fortzusetzen. Für jeden Nutzer:

  1. Rufen Sie die Zuordnung zwischen der Google-Identität und der externen Identität ab.
  2. Packen Sie das Paar in den Iterator, der von listUsers() zurückgegeben wird.

Nutzerzuordnung abrufen

In diesem Snippet wird gezeigt, wie Sie Identitätszuordnungen aus einer CSV-Datei abrufen:

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

Nutzerzuordnung in einen Iterator packen

Die listUsers() Methode gibt ein CheckpointCloseableIterable von IdentityUser Objekten zurück.

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

Gruppe abrufen

Überschreiben Sie listGroups(), um Gruppen und ihre Mitglieder abzurufen. Diese Methode akzeptiert einen Prüfpunkt. Für jede Gruppe:

  1. Rufen Sie die Gruppe und ihre Mitglieder ab.
  2. Packen Sie sie in den Iterator, der von listGroups() zurückgegeben wird.

Gruppenidentität abrufen

In diesem Snippet wird gezeigt, wie Sie Gruppen und Mitglieder aus einer CSV-Datei abrufen:

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

}

Gruppe und Mitglieder in einen Iterator packen

Die Methode listGroups() gibt ein CheckpointCloseableIterable von IdentityGroup Objekten zurück.

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

Nächste Schritte