Crea un connettore di identità

Per impostazione predefinita, Google Cloud Search riconosce solo le identità Google archiviate in Google Cloud Directory (utenti e gruppi). I connettori di identità sono utilizzati per sincronizzare le identità della tua azienda con le identità Google utilizzate da Google Cloud Search.

Google offre le seguenti opzioni per lo sviluppo di connettori di identità:

  • SDK Identity Connector. Questa opzione è rivolta agli sviluppatori che programmano nel linguaggio di programmazione Java. L'SDK Identity Connector è un wrapper intorno all'API REST, consentendoti di creare rapidamente connettori. Per creare un connettore di identità utilizzando l'SDK, fai riferimento Crea un connettore di identità utilizzando l'SDK Identity Connector.

  • Un'API REST e librerie API di basso livello. Queste opzioni sono rivolte agli sviluppatori che potrebbero non programmare in Java o il cui codebase supporta meglio tramite un'API REST o una libreria. Per creare un connettore di identità utilizzando l'API REST, consulta a API Directory: Account utente per informazioni sulla mappatura degli utenti Documentazione di Cloud Identity per e informazioni sui gruppi di mappatura.

Crea un connettore di identità utilizzando l'SDK Identity Connector

Un tipico connettore di identità esegue le seguenti attività:

  1. Configura il connettore.
  2. Recupera tutti gli utenti dal tuo sistema di identità aziendale e inviali a Google per la sincronizzazione con le identità Google.
  3. Recupera tutti i gruppi dal tuo sistema di identità aziendale e inviali a Google per la sincronizzazione con le identità Google.

Configura le dipendenze

Per utilizzare l'SDK, devi includere determinate dipendenze nel file di build. Clic in una scheda riportata di seguito per visualizzare le dipendenze per il tuo ambiente di build:

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'

Crea la configurazione del connettore

Ogni connettore dispone di un file di configurazione contenente i parametri utilizzati dal come l'ID del repository. I parametri sono definiti coppie chiave-valore, come api.sourceId=1234567890abcdef.

L'SDK di Google Cloud Search contiene diverse configurazioni fornite da Google utilizzati da tutti i connettori. Devi dichiarare quanto segue Parametri forniti da Google nel tuo file di configurazione:

  • Per un connettore di contenuti, devi dichiarare api.sourceId e api.serviceAccountPrivateKeyFile mentre questi parametri identificano la località del repository e della chiave privata necessari per accedere al repository.
  • Per un connettore di identità, devi dichiarare api.identitySourceId come questo identifica la posizione dell'origine identità esterna. Se utenti sincronizzati, devi anche dichiarare api.customerId come ID univoco per l'account Google Workspace della tua azienda.

A meno che tu non voglia eseguire l'override dei valori predefiniti non occorre dichiararli nel file di configurazione. Per ulteriori informazioni sui parametri di configurazione forniti da Google, come come generare determinati ID e chiavi, consulta Parametri di configurazione forniti da Google.

Puoi anche definire parametri personalizzati per il repository da utilizzare nelle di configurazione del deployment.

Passa il file di configurazione al connettore

Imposta la proprietà di sistema config per trasferire il file di configurazione al tuo di rete. Puoi impostare la proprietà utilizzando l'argomento -D quando inizi il connettore. Ad esempio, il seguente comando avvia il connettore con il file di configurazione MyConfig.properties:

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

Se questo argomento non è presente, l'SDK tenta di accedere a una configurazione predefinita file denominato connector-config.properties.

Crea un connettore di identità di sincronizzazione completo utilizzando una classe di modello

L'SDK Identity Connector contiene una classe modello FullSyncIdentityConnector che puoi utilizzare per sincronizzare tutti gli utenti e i gruppi dall'identità un repository con identità Google. In questa sezione viene illustrato come utilizzare FullSyncIdentityConnector modello per eseguire una sincronizzazione completa di utenti e gruppi da un'identità non Google repository Git.

Questa sezione della documentazione fa riferimento agli snippet di codice IdentityConnecorSample.java campione. Questo esempio legge utente e gruppo da due file CSV e le sincronizza con le identità Google.

Implementa il punto di ingresso del connettore

Il punto di ingresso di un connettore è main(). L'attività principale di questo metodo è creare un'istanza Application e richiamare la sua start() per eseguire il connettore.

Prima di chiamare application.start(), utilizza la IdentityApplication.Builder per creare un'istanza modello FullSyncIdentityConnector. L'FullSyncIdentityConnector accetta un Repository di cui implementerai i metodi. Il seguente snippet di codice mostra come implementare il metodo main():

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

In background, l'SDK chiama initConfig() dopo le chiamate al metodo main() del connettore Application.build. Il metodo initConfig() esegue le seguenti attività:

  1. Chiama il Configuation.isInitialized() per garantire che Configuration non è stato inizializzato.
  2. Inizializza un oggetto Configuration con la coppia chiave-valore fornita da Google in coppia. Ogni coppia chiave-valore è archiviata in ConfigValue all'interno dell'oggetto Configuration.

Implementa l'interfaccia di Repository

L'unico scopo dell'oggetto Repository è eseguire la sincronizzazione delle identità del repository con le identità Google. Quando si utilizza devi eseguire l'override solo di alcuni metodi all'interno Repository per creare un connettore di identità. Per FullTraversalConnector , probabilmente eseguirai l'override dei seguenti metodi:

  • La init() . Per eseguire qualsiasi configurazione e inizializzazione del repository di identità, sostituisci il metodo "init()".

  • La listUsers() . Per sincronizzare tutti gli utenti nel repository di identità con gli utenti Google, sostituisci il metodo listUsers().

  • La listGroups() . Per sincronizzare tutti i gruppi nel repository di identità con Google Gruppi: sostituisci il metodo listGroups().

  • (Facoltativo) Il campo close() . Se devi eseguire la pulizia del repository, esegui l'override di close() . Questo metodo viene chiamato una volta durante l'arresto del connettore.

Ottieni parametri di configurazione personalizzati

Come parte della gestione della configurazione del connettore, dovrai ottenere parametri personalizzati Configuration . Questa attività viene solitamente eseguita in uno Repository del corso init() .

La classe Configuration offre diversi metodi per ottenere diversi tipi di dati da una configurazione. Ogni metodo restituisce un ConfigValue . Userai quindi l'attributo ConfigValue get() per recuperare il valore effettivo. Il seguente snippet mostra come recuperare userMappingCsvPath e Valore groupMappingCsvPath da un oggetto Configuration:

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

Per ottenere e analizzare un parametro contenente più valori, utilizza uno dei Parser di tipo Configuration per analizzare i dati in blocchi discreti. Il seguente snippet del connettore tutorial utilizza la classe getMultiValue per ottenere un elenco di nomi di repository GitHub:

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

Ottieni il mapping per tutti gli utenti

Esegui override listUsers() per recuperare la mappatura di tutti gli utenti dal tuo repository di identità. La Il metodo listUsers() accetta un checkpoint che rappresenta l'ultima identità da eseguire sincronizzati. Il checkpoint può essere utilizzato per riprendere la sincronizzazione nel caso in cui il processo venga interrotto. Per ogni utente del tuo repository, eseguirai questi passaggi il metodo listUsers():

  1. Ottieni una mappatura composta dall'identità Google e da quelli esterni associati e identità di base.
  2. Pacchettizza la coppia in un iteratore restituito dal metodo listUsers().

Ottieni una mappatura utente

Il seguente snippet di codice mostra come recuperare le mappature delle identità archiviati in un file 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);
    }
  }
  // ...
}

Pacchettizzazione di una mappatura utente in un iteratore

La listUsers() restituisce un Iterator, in particolare un CheckpointCloseableIterable di IdentityUser di oggetti strutturati. Puoi utilizzare lo CheckpointClosableIterableImpl.Builder per creare e restituire un iteratore. Il seguente snippet di codice mostra come per pacchettizzare ogni mappatura in un elenco di build per l'iteratore elenco:

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

Crea un gruppo

Esegui override listGroups() per recuperare tutti i gruppi e i loro membri dalla tua identità repository Git. Il metodo listGroups() accetta un checkpoint che rappresenta l'ultimo identità da sincronizzare. Il checkpoint può essere utilizzato per riprendere la sincronizzazione nel caso in cui l'interruzione del processo. Per ogni utente del tuo repository, eseguirai questi passaggi passaggi nel metodo listGroups():

  1. Recupera il gruppo e i relativi membri.
  2. Pacchettizza ogni gruppo e i membri in un iteratore restituito dal listGroups().

Recuperare l'identità del gruppo

Il seguente snippet di codice mostra come recuperare i gruppi e i membri archiviati in un file 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);
    }
  }
  // ...

}

Pacchettizzare il gruppo e i membri in un iteratore

La listGroups() restituisce un Iterator, in particolare un CheckpointCloseableIterable di IdentityGroup di oggetti strutturati. Puoi utilizzare lo CheckpointClosableIterableImpl.Builder per creare e restituire un iteratore. Il seguente snippet di codice mostra come pacchettizzare ogni gruppo e i membri in un elenco e creare l'iteratore partendo da quel elenco:

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

Passaggi successivi

Di seguito sono riportati alcuni passaggi che puoi eseguire: