Identitätsconnector erstellen

Standardmäßig werden von Google Cloud Search nur Google-Identitäten im Google Cloud-Verzeichnis erkannt. Mit Identitätsconnectors können Sie Unternehmensidentitäten mit den Google-Identitäten 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

Für einen normalen Identitätsconnector führen Sie die folgenden Schritte aus:

  1. Konfiguriert den Connector.
  2. Ruft Nutzer aus Ihrem Identitätssystem ab und sendet sie an Google.
  3. 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'

Connectorkonfiguration 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 identifizieren Ihr Repository und den für den Zugriff erforderlichen privaten Schlüssel.
  • Identitätsconnector: Deklarieren Sie api.identitySourceId, um Ihre externe Identitätsquelle zu identifizieren. Für die Nutzersynchronisierung müssen Sie auch api.customerId (die eindeutige ID für Ihr Google Workspace-Konto) deklarieren.

Andere von Google bereitgestellte Parameter müssen nur deklariert werden, wenn Sie ihre Standardwerte überschreiben möchten. 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 beim Starten des Connectors das Argument -D. 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 erläutert, wie Sie das Tool verwenden.

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(). Dabei wird eine Application-Instanz erstellt und start() aufgerufen, um den Connector auszuführen.

Verwenden Sie IdentityApplication.Builder, um die Vorlage FullSyncIdentityConnector 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 Application.build() von der Methode main() aufgerufen wurde. Die Methode initConfig():

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

Repository-Schnittstelle 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 die Einrichtung und Initialisierung.
  • listUsers(): Alle Nutzer synchronisieren.
  • 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 CSV-Pfade abgerufen werden:

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 abrufen und parsen möchten, der mehrere Werte enthält, verwenden Sie einen Typ-Parser der Klasse Configuration, um die Daten in einzelne Blöcke zu parsen. Das folgende Snippet aus dem Connectorbeispiel des Tutorials zeigt, wie Sie mithilfe der Methode getMultiValue 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. An diese Methode kann ein Prüfpunkt übergeben werden, um die Synchronisierung nach einer Unterbrechung fortzusetzen. Für jeden Nutzer:

  1. Die Zuordnung zwischen der Google-Identität und der externen Identität abrufen
  2. Fügen Sie dieses Paar dem Iterator hinzu, der von listUsers() zurückgegeben wird.

Nutzerzuordnung abrufen

In diesem Snippet sehen Sie, wie Identitätszuordnungen aus einer CSV-Datei abgerufen werden:

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 Methode listUsers() gibt einen 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 deren Mitglieder abzurufen. Diese Methode akzeptiert einen Prüfpunkt. Für jede Gruppe:

  1. Rufen Sie die Gruppe und ihre Mitglieder ab.
  2. Fügen Sie sie dem Iterator hinzu, der von listGroups() zurückgegeben wird.

Gruppenidentität abrufen

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

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

}

Gruppen samt Mitgliedern in einen Iterator packen

Die Methode listGroups() gibt eine 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