Udostępnij za pośrednictwem


Zarządzanie listami ACL w usłudze Azure Data Lake Storage Gen2 przy użyciu języka Java

W tym artykule pokazano, jak używać języka Java do pobierania, ustawiania i aktualizowania list kontroli dostępu katalogów i plików.

Dziedziczenie listy ACL jest już dostępne dla nowych elementów podrzędnych utworzonych w katalogu nadrzędnym. Można jednak również dodawać, aktualizować i usuwać listy ACL cyklicznie w istniejących elementach podrzędnych katalogu nadrzędnego bez konieczności wprowadzania tych zmian indywidualnie dla każdego elementu podrzędnego.

Package (Maven)Samples API reference Gen1 to Gen2 mapping Give Feedback (Package (Maven)Samples API reference Gen1 to Gen2 mapping (Package (Maven) | Samples | API reference | Gen1 to Gen2 mapping (Tworzenie mapowania |

Wymagania wstępne

  • Subskrypcja platformy Azure. Zobacz Uzyskiwanie bezpłatnej wersji próbnej platformy Azure.

  • Konto magazynu z włączoną hierarchiczną przestrzenią nazw (HNS). Postępuj zgodnie z tymi instrukcjami, aby je utworzyć.

  • Wersja interfejsu wiersza polecenia platformy Azure lub nowsza 2.6.0 .

  • Jedno z następujących uprawnień zabezpieczeń:

    • Aprowizowana jednostka zabezpieczeń identyfikatora entra firmy Microsoft, która została przypisana do roli właściciela danych obiektu blob usługi Storage, w zakresie kontenera docelowego, konta magazynu, nadrzędnej grupy zasobów lub subskrypcji.

    • Właścicielem kontenera docelowego lub katalogu, do którego planujesz zastosować ustawienia listy ACL. Aby ustawić listy ACL cyklicznie, obejmuje to wszystkie elementy podrzędne w kontenerze docelowym lub katalogu.

    • Klucz konta magazynu.

konfigurowanie projektu

Aby rozpocząć, otwórz tę stronę i znajdź najnowszą wersję biblioteki Języka Java. Następnie otwórz plik pom.xml w edytorze tekstów. Dodaj element zależności, który odwołuje się do tej wersji.

Jeśli planujesz uwierzytelnić aplikację kliencką przy użyciu identyfikatora Entra firmy Microsoft, dodaj zależność do biblioteki klienta wpisu tajnego platformy Azure. Zobacz Dodawanie pakietu biblioteki klienta wpisu tajnego do projektu.

Następnie dodaj te instrukcje importowania do pliku kodu.

import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.file.datalake.DataLakeDirectoryClient;
import com.azure.storage.file.datalake.DataLakeFileClient;
import com.azure.storage.file.datalake.DataLakeFileSystemClient;
import com.azure.storage.file.datalake.DataLakeServiceClient;
import com.azure.storage.file.datalake.DataLakeServiceClientBuilder;
import com.azure.storage.file.datalake.models.ListPathsOptions;
import com.azure.storage.file.datalake.models.PathItem;
import com.azure.storage.file.datalake.models.AccessControlChangeCounters;
import com.azure.storage.file.datalake.models.AccessControlChangeResult;
import com.azure.storage.file.datalake.models.AccessControlType;
import com.azure.storage.file.datalake.models.PathAccessControl;
import com.azure.storage.file.datalake.models.PathAccessControlEntry;
import com.azure.storage.file.datalake.models.PathPermissions;
import com.azure.storage.file.datalake.models.PathRemoveAccessControlEntry;
import com.azure.storage.file.datalake.models.RolePermissions;
import com.azure.storage.file.datalake.options.PathSetAccessControlRecursiveOptions;

Połączenie do konta

Aby użyć fragmentów kodu w tym artykule, należy utworzyć wystąpienie Elementu DataLakeServiceClient reprezentujące konto magazynu.

Połączenie przy użyciu identyfikatora Entra firmy Microsoft

Możesz użyć biblioteki klienta tożsamości platformy Azure dla języka Java do uwierzytelniania aplikacji za pomocą identyfikatora Entra firmy Microsoft.

Najpierw musisz przypisać do podmiotu zabezpieczeń jedną z następujących ról kontroli dostępu na podstawie ról (RBAC) platformy Azure:

Rola Możliwość ustawiania listy ACL
Właściciel danych obiektu blob usługi Storage Wszystkie katalogi i pliki na koncie.
Współautor danych obiektu blob usługi Storage Tylko katalogi i pliki należące do podmiotu zabezpieczeń.

Następnie utwórz wystąpienie Klasy DataLakeServiceClient i przekaż nowe wystąpienie klasy DefaultAzureCredential .

static public DataLakeServiceClient GetDataLakeServiceClient(String accountName){
    DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();

    DataLakeServiceClient dataLakeServiceClient = new DataLakeServiceClientBuilder()
        .endpoint("https://" + accountName + ".dfs.core.windows.net")
        .credential(defaultCredential)
        .buildClient();

    return dataLakeServiceClient;
}

Aby dowiedzieć się więcej na temat używania elementu DefaultAzureCredential do autoryzowania dostępu do danych, zobacz Biblioteka klienta tożsamości platformy Azure dla języka Java.

Połączenie przy użyciu klucza konta

Dostęp do danych można autoryzować przy użyciu kluczy dostępu do konta (klucza współużytkowanego). W tym przykładzie jest tworzone wystąpienie Elementu DataLakeServiceClient autoryzowane za pomocą klucza konta.

static public DataLakeServiceClient GetDataLakeServiceClient
(String accountName, String accountKey){
    StorageSharedKeyCredential sharedKeyCredential =
        new StorageSharedKeyCredential(accountName, accountKey);

    DataLakeServiceClient dataLakeServiceClient = new DataLakeServiceClientBuilder()
        .endpoint("https://" + accountName + ".dfs.core.windows.net")
        .credential(sharedKeyCredential)
        .buildClient();

    return dataLakeServiceClient;
}

Uwaga

Autoryzacja z kluczem udostępnionym nie jest zalecana, ponieważ może być mniej bezpieczna. Aby uzyskać optymalne zabezpieczenia, wyłącz autoryzację za pośrednictwem klucza współdzielonego dla konta magazynu, zgodnie z opisem w temacie Zapobieganie autoryzacji klucza współdzielonego dla konta usługi Azure Storage.

Korzystanie z kluczy dostępu i parametry połączenia powinno być ograniczone do początkowego sprawdzania koncepcji lub prototypów programistycznych, które nie uzyskują dostępu do danych produkcyjnych ani poufnych. W przeciwnym razie klasy uwierzytelniania oparte na tokenach dostępne w zestawie Azure SDK powinny być zawsze preferowane podczas uwierzytelniania w zasobach platformy Azure.

Firma Microsoft zaleca, aby klienci używali identyfikatora Entra firmy Microsoft lub sygnatury dostępu współdzielonego (SAS), aby autoryzować dostęp do danych w usłudze Azure Storage. Aby uzyskać więcej informacji, zobacz Autoryzacja operacji na potrzeby dostępu do danych.

Ustawianie list ACL

Po ustawieniu listy ACL należy zastąpić całą listę ACL wraz ze wszystkimi jego wpisami. Jeśli chcesz zmienić poziom uprawnień podmiotu zabezpieczeń lub dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne istniejące wpisy, należy zaktualizować listę ACL. Aby zaktualizować listę ACL zamiast jej zastąpić, zobacz sekcję Aktualizowanie list ACL w tym artykule.

Jeśli zdecydujesz się ustawić listę ACL, musisz dodać wpis dla użytkownika będącego właścicielem, wpis dla grupy właścicieli i wpis dla wszystkich innych użytkowników. Aby dowiedzieć się więcej na temat użytkownika, grupy właścicieli i wszystkich innych użytkowników, zobacz Użytkownicy i tożsamości.

W tej sekcji pokazano, jak wykonać następujące działania:

  • Ustawianie listy ACL katalogu
  • Ustawianie listy ACL pliku
  • Cykliczne ustawianie list kontroli dostępu

Ustawianie listy ACL katalogu

Ten przykład pobiera i ustawia listę ACL katalogu o nazwie my-directory. W tym przykładzie użytkownik jest właścicielem uprawnień do odczytu, zapisu i wykonywania, nadaje grupie właściciel tylko uprawnienia do odczytu i wykonywania oraz zapewnia wszystkim innym dostęp do odczytu.

  public void ManageDirectoryACLs(DataLakeFileSystemClient fileSystemClient){

      DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("");

      PathAccessControl directoryAccessControl =
          directoryClient.getAccessControl();

      List<PathAccessControlEntry> pathPermissions = directoryAccessControl.getAccessControlList();
     
      System.out.println(PathAccessControlEntry.serializeList(pathPermissions));
           
      RolePermissions groupPermission = new RolePermissions();
      groupPermission.setExecutePermission(true).setReadPermission(true);

      RolePermissions ownerPermission = new RolePermissions();
      ownerPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

      RolePermissions otherPermission = new RolePermissions();
      otherPermission.setReadPermission(true);

      PathPermissions permissions = new PathPermissions();

      permissions.setGroup(groupPermission);
      permissions.setOwner(ownerPermission);
      permissions.setOther(otherPermission);

      directoryClient.setPermissions(permissions, null, null);

      pathPermissions = directoryClient.getAccessControl().getAccessControlList();
   
      System.out.println(PathAccessControlEntry.serializeList(pathPermissions));

  }

Listę ACL katalogu głównego kontenera można również pobrać i ustawić. Aby uzyskać katalog główny, przekaż pusty ciąg ("") do metody DataLakeFileSystemClient.getDirectoryClient .

Ustawianie listy ACL pliku

Ten przykład pobiera i ustawia listę ACL pliku o nazwie upload-file.txt. W tym przykładzie użytkownik jest właścicielem uprawnień do odczytu, zapisu i wykonywania, nadaje grupie właściciel tylko uprawnienia do odczytu i wykonywania oraz zapewnia wszystkim innym dostęp do odczytu.

 public void ManageFileACLs(DataLakeFileSystemClient fileSystemClient){

     DataLakeDirectoryClient directoryClient =
       fileSystemClient.getDirectoryClient("my-directory");

     DataLakeFileClient fileClient = 
       directoryClient.getFileClient("uploaded-file.txt");

     PathAccessControl fileAccessControl =
         fileClient.getAccessControl();

   List<PathAccessControlEntry> pathPermissions = fileAccessControl.getAccessControlList();
  
   System.out.println(PathAccessControlEntry.serializeList(pathPermissions));
        
   RolePermissions groupPermission = new RolePermissions();
   groupPermission.setExecutePermission(true).setReadPermission(true);

   RolePermissions ownerPermission = new RolePermissions();
   ownerPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

   RolePermissions otherPermission = new RolePermissions();
   otherPermission.setReadPermission(true);

   PathPermissions permissions = new PathPermissions();

   permissions.setGroup(groupPermission);
   permissions.setOwner(ownerPermission);
   permissions.setOther(otherPermission);

   fileClient.setPermissions(permissions, null, null);

   pathPermissions = fileClient.getAccessControl().getAccessControlList();

   System.out.println(PathAccessControlEntry.serializeList(pathPermissions));

 }

Cykliczne ustawianie list kontroli dostępu

Ustaw listy ACL rekursywnie, wywołując metodę DataLakeDirectoryClient.setAccessControlRecursive . Przekaż tę metodę jako listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis listy ACL.

Jeśli chcesz ustawić domyślny wpis listy ACL, możesz wywołać metodę setDefaultScope elementu PathAccessControlEntry i przekazać wartość true.

W tym przykładzie ustawiono listę ACL katalogu o nazwie my-parent-directory. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope , który określa, czy ustawić domyślną listę ACL. Ten parametr jest używany w każdym wywołaniu metody setDefaultScope metody PathAccessControlEntry. Wpisy listy ACL dają właścicielowi uprawnienia do odczytu, zapisu i wykonywania, zapewniają uprawnienia tylko do odczytu i wykonywania grupy, a także zapewniają wszystkim innym użytkownikom dostęp bez dostępu. Ostatni wpis listy ACL w tym przykładzie zawiera określonego użytkownika o identyfikatorze obiektu "xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" uprawnienia do odczytu i wykonywania.

public void SetACLRecursively(DataLakeFileSystemClient fileSystemClient, Boolean isDefaultScope){
    
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-parent-directory");

    List<PathAccessControlEntry> pathAccessControlEntries = 
        new ArrayList<PathAccessControlEntry>();

    // Create owner entry.
    PathAccessControlEntry ownerEntry = new PathAccessControlEntry();

    RolePermissions ownerPermission = new RolePermissions();
    ownerPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

    ownerEntry.setDefaultScope(isDefaultScope);
    ownerEntry.setAccessControlType(AccessControlType.USER);
    ownerEntry.setPermissions(ownerPermission);

    pathAccessControlEntries.add(ownerEntry);

    // Create group entry.
    PathAccessControlEntry groupEntry = new PathAccessControlEntry();

    RolePermissions groupPermission = new RolePermissions();
    groupPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(false);

    groupEntry.setDefaultScope(isDefaultScope);
    groupEntry.setAccessControlType(AccessControlType.GROUP);
    groupEntry.setPermissions(groupPermission);

    pathAccessControlEntries.add(groupEntry);

    // Create other entry.
    PathAccessControlEntry otherEntry = new PathAccessControlEntry();

    RolePermissions otherPermission = new RolePermissions();
    otherPermission.setExecutePermission(false).setReadPermission(false).setWritePermission(false);

    otherEntry.setDefaultScope(isDefaultScope);
    otherEntry.setAccessControlType(AccessControlType.OTHER);
    otherEntry.setPermissions(otherPermission);

    pathAccessControlEntries.add(otherEntry);

    // Create named user entry.
    PathAccessControlEntry userEntry = new PathAccessControlEntry();

    RolePermissions userPermission = new RolePermissions();
    userPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(false);

    userEntry.setDefaultScope(isDefaultScope);
    userEntry.setAccessControlType(AccessControlType.USER);
    userEntry.setEntityId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
    userEntry.setPermissions(userPermission);    
    
    pathAccessControlEntries.add(userEntry);
    
    directoryClient.setAccessControlRecursive(pathAccessControlEntries);        

}

Aktualizowanie list ACL

Podczas aktualizowania listy ACL należy zmodyfikować listę ACL zamiast zastąpić listę ACL. Można na przykład dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne podmioty zabezpieczeń wymienione na liście ACL. Aby zastąpić listę ACL zamiast ją zaktualizować, zobacz sekcję Ustawianie list ACL w tym artykule.

W tej sekcji pokazano, jak wykonać następujące działania:

  • Aktualizowanie listy ACL
  • Rekursywne aktualizowanie list ACL

Aktualizowanie listy ACL

Najpierw pobierz listę ACL katalogu, wywołując metodę PathAccessControl.getAccessControlList . Skopiuj listę wpisów listy ACL do nowego obiektu Listy typu PathAccessControlListEntry. Następnie znajdź wpis, który chcesz zaktualizować i zastąp go na liście. Ustaw listę ACL, wywołując metodę DataLakeDirectoryClient.setAccessControlList .

W tym przykładzie lista ACL katalogu o nazwie my-parent-directory została zastąpiona wpisem dla wszystkich innych użytkowników.

   public void UpdateACL(DataLakeFileSystemClient fileSystemClient, Boolean isDefaultScope){

       DataLakeDirectoryClient directoryClient =
       fileSystemClient.getDirectoryClient("my-parent-directory");

       List<PathAccessControlEntry> pathAccessControlEntries = 
           directoryClient.getAccessControl().getAccessControlList();

       int index = -1;

       for (PathAccessControlEntry pathAccessControlEntry : pathAccessControlEntries){
           
           if (pathAccessControlEntry.getAccessControlType() == AccessControlType.OTHER){
               index = pathAccessControlEntries.indexOf(pathAccessControlEntry);
               break;
           }
       }

       if (index > -1){

       PathAccessControlEntry userEntry = new PathAccessControlEntry();

       RolePermissions userPermission = new RolePermissions();
       userPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

       userEntry.setDefaultScope(isDefaultScope);
       userEntry.setAccessControlType(AccessControlType.OTHER);
       userEntry.setPermissions(userPermission);  
       
       pathAccessControlEntries.set(index, userEntry);
       }

       directoryClient.setAccessControlList(pathAccessControlEntries, 
           directoryClient.getAccessControl().getGroup(), 
           directoryClient.getAccessControl().getOwner());
   
   }

Listę ACL katalogu głównego kontenera można również pobrać i ustawić. Aby uzyskać katalog główny, przekaż pusty ciąg ("") do metody DataLakeFileSystemClient.getDirectoryClient .

Rekursywne aktualizowanie list ACL

Aby zaktualizować listę ACL rekursywnie, utwórz nowy obiekt listy ACL z wpisem listy ACL, który chcesz zaktualizować, a następnie użyj tego obiektu w operacji aktualizacji listy ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy listy ACL do zaktualizowania.

Aktualizuj listy ACL cyklicznie, wywołując metodę DataLakeDirectoryClient.updateAccessControlRecursive . Przekaż tę metodę jako listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis listy ACL.

Jeśli chcesz zaktualizować domyślny wpis listy ACL, możesz wywołać metodę setDefaultScope elementu PathAccessControlEntry i przekazać wartość true.

W tym przykładzie zaktualizowano wpis listy ACL z uprawnieniami do zapisu. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope , który określa, czy zaktualizować domyślną listę ACL. Ten parametr jest używany w wywołaniu metody setDefaultScope metody PathAccessControlEntry.

public void UpdateACLRecursively(DataLakeFileSystemClient fileSystemClient, Boolean isDefaultScope){

    DataLakeDirectoryClient directoryClient =
    fileSystemClient.getDirectoryClient("my-parent-directory");

    List<PathAccessControlEntry> pathAccessControlEntries = 
        new ArrayList<PathAccessControlEntry>();

    // Create named user entry.
    PathAccessControlEntry userEntry = new PathAccessControlEntry();

    RolePermissions userPermission = new RolePermissions();
    userPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

    userEntry.setDefaultScope(isDefaultScope);
    userEntry.setAccessControlType(AccessControlType.USER);
    userEntry.setEntityId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
    userEntry.setPermissions(userPermission);    
    
    pathAccessControlEntries.add(userEntry);
    
    directoryClient.updateAccessControlRecursive(pathAccessControlEntries);        

}

Usuwanie wpisów listy ACL

Można usunąć co najmniej jeden wpis listy ACL. W tej sekcji pokazano, jak wykonać następujące działania:

  • Usuwanie wpisu listy ACL
  • Usuwanie wpisów listy ACL rekursywnie

Usuwanie wpisu listy ACL

Najpierw pobierz listę ACL katalogu, wywołując metodę PathAccessControl.getAccessControlList . Skopiuj listę wpisów listy ACL do nowego obiektu Listy typu PathAccessControlListEntry. Następnie znajdź wpis, który chcesz usunąć, i wywołaj metodę Remove obiektu List. Ustaw zaktualizowaną listę ACL, wywołując metodę DataLakeDirectoryClient.setAccessControlList .

 public void RemoveACLEntry(DataLakeFileSystemClient fileSystemClient, Boolean isDefaultScope){

     DataLakeDirectoryClient directoryClient =
     fileSystemClient.getDirectoryClient("my-parent-directory");

     List<PathAccessControlEntry> pathAccessControlEntries = 
         directoryClient.getAccessControl().getAccessControlList();

     PathAccessControlEntry entryToRemove = null;

     for (PathAccessControlEntry pathAccessControlEntry : pathAccessControlEntries){
         
         if (pathAccessControlEntry.getEntityId() != null){

             if (pathAccessControlEntry.getEntityId().equals("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")){
                 entryToRemove = pathAccessControlEntry;
                 break;
             }
         }

     }

     if (entryToRemove != null){
         
         pathAccessControlEntries.remove(entryToRemove);

         directoryClient.setAccessControlList(pathAccessControlEntries, 
         directoryClient.getAccessControl().getGroup(), 
         directoryClient.getAccessControl().getOwner());   
     }

 
 }

Usuwanie wpisów listy ACL rekursywnie

Aby usunąć wpisy listy ACL cyklicznie, utwórz nowy obiekt listy ACL dla wpisu listy ACL do usunięcia, a następnie użyj tego obiektu w operacji usuwania listy ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy listy ACL do usunięcia.

Usuń wpisy listy ACL, wywołując metodę DataLakeDirectoryClient.removeAccessControlRecursive . Przekaż tę metodę jako listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis listy ACL.

Jeśli chcesz usunąć domyślny wpis listy ACL, możesz wywołać metodę setDefaultScope elementu PathAccessControlEntry i przekazać wartość true.

W tym przykładzie usunięto wpis listy ACL z listy ACL katalogu o nazwie my-parent-directory. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope , który określa, czy usunąć wpis z domyślnej listy ACL. Ten parametr jest używany w wywołaniu metody setDefaultScope metody PathAccessControlEntry.

  public void RemoveACLEntryRecursively(DataLakeFileSystemClient fileSystemClient, Boolean isDefaultScope){

      DataLakeDirectoryClient directoryClient =
      fileSystemClient.getDirectoryClient("my-parent-directory");

      List<PathRemoveAccessControlEntry> pathRemoveAccessControlEntries = 
          new ArrayList<PathRemoveAccessControlEntry>();

      // Create named user entry.
      PathRemoveAccessControlEntry userEntry = new PathRemoveAccessControlEntry();

      RolePermissions userPermission = new RolePermissions();
      userPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);

      userEntry.setDefaultScope(isDefaultScope);
      userEntry.setAccessControlType(AccessControlType.USER);
      userEntry.setEntityId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"); 
      
      pathRemoveAccessControlEntries.add(userEntry);
      
      directoryClient.removeAccessControlRecursive(pathRemoveAccessControlEntries);      
  
  }

Odzyskiwanie po awariach

Mogą wystąpić błędy środowiska uruchomieniowego lub uprawnień. W przypadku błędów środowiska uruchomieniowego uruchom ponownie proces od początku. Błędy uprawnień mogą wystąpić, jeśli podmiot zabezpieczeń nie ma wystarczających uprawnień do modyfikowania listy ACL katalogu lub pliku, który znajduje się w hierarchii katalogów, które są modyfikowane. Rozwiąż problem z uprawnieniami, a następnie wybierz, aby wznowić proces od punktu awarii przy użyciu tokenu kontynuacji lub uruchomić ponownie proces od początku. Jeśli wolisz ponownie uruchomić od początku, nie musisz używać tokenu kontynuacji. Możesz ponownie zastosować wpisy listy ACL bez negatywnego wpływu.

Ten przykład zwraca token kontynuacji w przypadku awarii. Aplikacja może wywołać tę przykładową metodę ponownie po usunięciu błędu i przekazać token kontynuacji. Jeśli ta przykładowa metoda jest wywoływana po raz pierwszy, aplikacja może przekazać wartość null parametru tokenu kontynuacji.

public String ResumeSetACLRecursively(DataLakeFileSystemClient fileSystemClient,
    DataLakeDirectoryClient directoryClient,
    List<PathAccessControlEntry> accessControlList, 
    String continuationToken){

    try{
        PathSetAccessControlRecursiveOptions options = new PathSetAccessControlRecursiveOptions(accessControlList);
        
        options.setContinuationToken(continuationToken);
    
       Response<AccessControlChangeResult> accessControlChangeResult =  
          directoryClient.setAccessControlRecursiveWithResponse(options, null, null);

       if (accessControlChangeResult.getValue().getCounters().getFailedChangesCount() > 0)
       {
          continuationToken =
              accessControlChangeResult.getValue().getContinuationToken();
       }
    
       return continuationToken;

    }
    catch(Exception ex){
    
        System.out.println(ex.toString());
        return continuationToken;
    }


}

Jeśli chcesz, aby proces był nieprzerwany przez błędy uprawnień, możesz to określić.

Aby upewnić się, że proces zakończy się nieprzerwanie, wywołaj metodę setContinueOnFailure obiektu PathSetAccessControlRecursiveOptions i przekaż wartość true.

W tym przykładzie cyklicznie ustawiane są wpisy listy ACL. Jeśli ten kod napotka błąd uprawnień, rejestruje ten błąd i kontynuuje wykonywanie. W tym przykładzie jest drukowana liczba niepowodzeń w konsoli programu .

public void ContinueOnFailure(DataLakeFileSystemClient fileSystemClient,
    DataLakeDirectoryClient directoryClient,
    List<PathAccessControlEntry> accessControlList){
    
    PathSetAccessControlRecursiveOptions options = 
       new PathSetAccessControlRecursiveOptions(accessControlList);
        
    options.setContinueOnFailure(true);
    
    Response<AccessControlChangeResult> accessControlChangeResult =  
        directoryClient.setAccessControlRecursiveWithResponse(options, null, null);

    AccessControlChangeCounters counters = accessControlChangeResult.getValue().getCounters();

    System.out.println("Number of directories changes: " + 
        counters.getChangedDirectoriesCount());

    System.out.println("Number of files changed: " + 
        counters.getChangedDirectoriesCount());

    System.out.println("Number of failures: " + 
        counters.getChangedDirectoriesCount());
}

Najlepsze rozwiązania

Ta sekcja zawiera wskazówki dotyczące najlepszych rozwiązań dotyczących cyklicznego ustawiania list ACL.

Obsługa błędów środowiska uruchomieniowego

Błąd środowiska uruchomieniowego może wystąpić z wielu powodów (na przykład: awaria lub problem z łącznością klienta). Jeśli wystąpi błąd środowiska uruchomieniowego, uruchom ponownie cyklicznego procesu listy ACL. Listy ACL można ponownie zastosować do elementów bez negatywnego wpływu.

Obsługa błędów uprawnień (403)

Jeśli wystąpi wyjątek kontroli dostępu podczas uruchamiania cyklicznego procesu listy ACL, podmiot zabezpieczeń usługi AD może nie mieć wystarczających uprawnień do zastosowania listy ACL do co najmniej jednego elementu podrzędnego w hierarchii katalogów. Po wystąpieniu błędu uprawnień proces zostanie zatrzymany i zostanie udostępniony token kontynuacji. Rozwiąż problem z uprawnieniami, a następnie użyj tokenu kontynuacji, aby przetworzyć pozostały zestaw danych. Katalogi i pliki, które zostały już pomyślnie przetworzone, nie będą musiały zostać ponownie przetworzone. Możesz również ponownie uruchomić cyklicznego procesu listy ACL. Listy ACL można ponownie zastosować do elementów bez negatywnego wpływu.

Poświadczenia

Zalecamy aprowizację podmiotu zabezpieczeń firmy Microsoft, któremu przypisano rolę Właściciela danych obiektu blob usługi Storage w zakresie docelowego konta magazynu lub kontenera.

Wydajność

Aby zmniejszyć opóźnienie, zalecamy uruchomienie cyklicznego procesu listy ACL na maszynie wirtualnej platformy Azure znajdującej się w tym samym regionie co konto magazynu.

Limity listy ACL

Maksymalna liczba list ACL, które można zastosować do katalogu lub pliku, to 32 listy ACL dostępu i 32 domyślne listy ACL. Aby uzyskać więcej informacji, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage Gen2.

Zobacz też