Använda Java för att hantera ACL:er i Azure Data Lake Storage Gen2

Den här artikeln visar hur du använder Java för att hämta, ange och uppdatera åtkomstkontrollistor med kataloger och filer.

ACL-arv är redan tillgängligt för nya underordnade objekt som skapas under en överordnad katalog. Men du kan också lägga till, uppdatera och ta bort ACL:er rekursivt på befintliga underordnade objekt i en överordnad katalog utan att behöva göra dessa ändringar individuellt för varje underordnat objekt.

Paket (Maven)Exempel-API-referens | | | Gen1 till Gen2-mappning | Ge feedback

Förutsättningar

  • En Azure-prenumeration. Se Hämta en kostnadsfri utvärderingsversion av Azure.

  • Ett lagringskonto med hierarkisk namnrymd (HNS) aktiverat. Följ dessa instruktioner för att skapa en.

  • Azure CLI-version 2.6.0 eller senare.

  • En av följande säkerhetsbehörigheter:

    • Ett etablerat Säkerhetsobjekt för Microsoft Entra-ID som har tilldelats rollen Lagringsblobdataägare, begränsad till målcontainern, lagringskontot, den överordnade resursgruppen eller prenumerationen..

    • Ägande användare av målcontainern eller katalogen som du planerar att tillämpa ACL-inställningar på. Om du vill ange ACL:er rekursivt inkluderar detta alla underordnade objekt i målcontainern eller katalogen.

    • Lagringskontonyckel.

Konfigurera projektet

Kom igång genom att öppna den här sidan och hitta den senaste versionen av Java-biblioteket. Öppna sedan pom.xml-filen i textredigeraren. Lägg till ett beroendeelement som refererar till den versionen.

Om du planerar att autentisera klientprogrammet med hjälp av Microsoft Entra-ID lägger du till ett beroende i Azure Secret Client Library. Se Lägga till paketet Hemligt klientbibliotek i projektet.

Lägg sedan till importinstruktionerna i kodfilen.

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;

Anslut till kontot

Om du vill använda kodfragmenten i den här artikeln måste du skapa en DataLakeServiceClient-instans som representerar lagringskontot.

Anslut med hjälp av Microsoft Entra-ID

Du kan använda Azure Identity-klientbiblioteket för Java för att autentisera ditt program med Microsoft Entra-ID.

Först måste du tilldela någon av följande rollbaserade åtkomstkontrollroller i Azure (Azure RBAC) till ditt säkerhetsobjekt:

Roll ACL-inställningsfunktion
Storage Blob Data-ägare Alla kataloger och filer i kontot.
Storage Blob Data-deltagare Endast kataloger och filer som ägs av säkerhetsobjektet.

Skapa sedan en DataLakeServiceClient-instans och skicka in en ny instans av klassen 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;
}

Mer information om hur du använder DefaultAzureCredential för att auktorisera åtkomst till data finns i Azure Identity-klientbibliotek för Java.

Anslut med hjälp av en kontonyckel

Du kan auktorisera åtkomst till data med hjälp av dina kontoåtkomstnycklar (delad nyckel). I det här exemplet skapas en DataLakeServiceClient-instans som är auktoriserad med kontonyckeln.

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

Varning

Auktorisering med delad nyckel rekommenderas inte eftersom det kan vara mindre säkert. För optimal säkerhet inaktiverar du auktorisering via delad nyckel för ditt lagringskonto enligt beskrivningen i Förhindra auktorisering av delad nyckel för ett Azure Storage-konto.

Användning av åtkomstnycklar och anslutningssträng bör begränsas till inledande konceptbevisappar eller utvecklingsprototyper som inte har åtkomst till produktion eller känsliga data. Annars bör de tokenbaserade autentiseringsklasserna som är tillgängliga i Azure SDK alltid föredras när du autentiserar till Azure-resurser.

Microsoft rekommenderar att klienter använder antingen Microsoft Entra-ID eller en signatur för delad åtkomst (SAS) för att ge åtkomst till data i Azure Storage. Mer information finns i Auktorisera åtgärder för dataåtkomst.

Ange ACL:er

När du anger en ACL ersätter du hela ACL:en inklusive alla dess poster. Om du vill ändra behörighetsnivån för ett säkerhetsobjekt eller lägga till ett nytt säkerhetsobjekt i ACL:n utan att påverka andra befintliga poster bör du uppdatera ACL:en i stället. Information om hur du uppdaterar en ACL i stället för att ersätta den finns i avsnittet Uppdatera ACL:er i den här artikeln.

Om du väljer att ange ACL måste du lägga till en post för den ägande användaren, en post för ägande gruppen och en post för alla andra användare. Mer information om den ägande användaren, ägande gruppen och alla andra användare finns i Användare och identiteter.

Det här avsnittet visar hur du:

  • Ange ACL för en katalog
  • Ange ACL för en fil
  • Ange ACL:er rekursivt

Ange ACL för en katalog

Det här exemplet hämtar och anger sedan ACL för en katalog med namnet my-directory. Det här exemplet ger den ägande användaren läs-, skriv- och körningsbehörigheter, ger ägande gruppen endast läs- och körningsbehörigheter och ger alla andra läsåtkomst.

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

  }

Du kan också hämta och ange ACL för rotkatalogen för en container. För att hämta rotkatalogen skickar du en tom sträng ("") till metoden DataLakeFileSystemClient.getDirectoryClient .

Ange ACL för en fil

Det här exemplet hämtar och anger sedan ACL för en fil med namnet upload-file.txt. Det här exemplet ger den ägande användaren läs-, skriv- och körningsbehörigheter, ger ägande gruppen endast läs- och körningsbehörigheter och ger alla andra läsåtkomst.

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

 }

Ange ACL:er rekursivt

Ange ACL:er rekursivt genom att anropa metoden DataLakeDirectoryClient.setAccessControlRecursive . Skicka den här metoden till en lista överPathAccessControlEntry-objekt . Varje PathAccessControlEntry definierar en ACL-post.

Om du vill ange en standardpost för ACL kan du anropa metoden setDefaultScope för PathAccessControlEntry och skicka in värdet true.

I det här exemplet anges ACL för en katalog med namnet my-parent-directory. Den här metoden accepterar en boolesk parameter med namnet isDefaultScope som anger om standard-ACL ska anges. Den parametern används i varje anrop till metoden setDefaultScope för PathAccessControlEntry. Posterna i ACL ger den ägande användaren läs-, skriv- och körningsbehörighet, ger ägande gruppen endast läs- och körningsbehörigheter och ger alla andra ingen åtkomst. Den sista ACL-posten i det här exemplet ger en specifik användare med objekt-ID:t "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" läs- och körningsbehörigheter.

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

}

Uppdatera ACL:er

När du uppdaterar en ACL ändrar du ACL:en i stället för att ersätta ACL:en. Du kan till exempel lägga till ett nytt säkerhetsobjekt till ACL utan att påverka andra säkerhetsobjekt som anges i ACL: n. Om du vill ersätta ACL:en i stället för att uppdatera den läser du avsnittet Ange ACL:er i den här artikeln.

Det här avsnittet visar hur du:

  • Uppdatera en ACL
  • Uppdatera ACL:er rekursivt

Uppdatera en ACL

Hämta först ACL för en katalog genom att anropa metoden PathAccessControl.getAccessControlList . Kopiera listan med ACL-poster till ett nytt listobjekt av typen PathAccessControlListEntry. Leta sedan upp posten som du vill uppdatera och ersätt den i listan. Ange ACL genom att anropa metoden DataLakeDirectoryClient.setAccessControlList .

Det här exemplet uppdaterar ACL:en för en katalog med namnet my-parent-directory genom att ersätta posten för alla andra användare.

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

Du kan också hämta och ange ACL för rotkatalogen för en container. För att hämta rotkatalogen skickar du en tom sträng ("") till metoden DataLakeFileSystemClient.getDirectoryClient .

Uppdatera ACL:er rekursivt

Om du vill uppdatera en ACL rekursivt skapar du ett nytt ACL-objekt med den ACL-post som du vill uppdatera och använder sedan objektet i åtgärden uppdatera ACL. Hämta inte den befintliga ACL:en, ange bara ACL-poster som ska uppdateras.

Uppdatera ACL:er rekursivt genom att anropa metoden DataLakeDirectoryClient.updateAccessControlRecursive . Skicka den här metoden till en lista överPathAccessControlEntry-objekt . Varje PathAccessControlEntry definierar en ACL-post.

Om du vill uppdatera en standardpost för ACL kan du anropa metoden setDefaultScope för PathAccessControlEntry och skicka in värdet true.

I det här exemplet uppdateras en ACL-post med skrivbehörighet. Den här metoden accepterar en boolesk parameter med namnet isDefaultScope som anger om standard-ACL ska uppdateras. Den parametern används i anropet till metoden setDefaultScope för 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);        

}

Ta bort ACL-poster

Du kan ta bort en eller flera ACL-poster. Det här avsnittet visar hur du:

  • Ta bort en ACL-post
  • Ta bort ACL-poster rekursivt

Ta bort en ACL-post

Hämta först ACL för en katalog genom att anropa metoden PathAccessControl.getAccessControlList . Kopiera listan med ACL-poster till ett nytt listobjekt av typen PathAccessControlListEntry. Leta sedan upp posten som du vill ta bort och anropa metoden Ta bort för listobjektet. Ange den uppdaterade ACL:en genom att anropa metoden 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());   
     }

 
 }

Ta bort ACL-poster rekursivt

Om du vill ta bort ACL-poster rekursivt skapar du ett nytt ACL-objekt för ACL-post som ska tas bort och använder sedan objektet i ta bort ACL-åtgärden. Hämta inte den befintliga ACL:en. Ange bara de ACL-poster som ska tas bort.

Ta bort ACL-poster genom att anropa metoden DataLakeDirectoryClient.removeAccessControlRecursive . Skicka den här metoden till en lista överPathAccessControlEntry-objekt . Varje PathAccessControlEntry definierar en ACL-post.

Om du vill ta bort en ACL-standardpost kan du anropa metoden setDefaultScope för PathAccessControlEntry och skicka in värdet true.

Det här exemplet tar bort en ACL-post från ACL för katalogen med namnet my-parent-directory. Den här metoden accepterar en boolesk parameter med namnet isDefaultScope som anger om posten ska tas bort från standard-ACL. Den parametern används i anropet till metoden setDefaultScope för 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);      
  
  }

Återställa från fel

Du kan stöta på körnings- eller behörighetsfel. Starta om processen från början för körningsfel. Behörighetsfel kan inträffa om säkerhetsobjektet inte har tillräcklig behörighet för att ändra ACL för en katalog eller fil som finns i kataloghierarkin som ändras. Åtgärda behörighetsproblemet och välj sedan att antingen återuppta processen från felpunkten med hjälp av en fortsättningstoken eller starta om processen från början. Du behöver inte använda fortsättningstoken om du föredrar att starta om från början. Du kan använda ACL-poster igen utan någon negativ inverkan.

Det här exemplet returnerar en fortsättningstoken i händelse av ett fel. Programmet kan anropa den här exempelmetoden igen när felet har åtgärdats och skicka in fortsättningstoken. Om den här exempelmetoden anropas för första gången kan programmet skicka in värdet null för parametern fortsättningstoken.

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


}

Om du vill att processen ska slutföras utan avbrott av behörighetsfel kan du ange det.

För att säkerställa att processen slutförs utan avbrott anropar du metoden setContinueOnFailure för ett PathSetAccessControlRecursiveOptions-objekt och skickar in värdet true.

Det här exemplet anger ACL-poster rekursivt. Om den här koden påträffar ett behörighetsfel registrerar den det felet och fortsätter körningen. I det här exemplet skrivs antalet fel ut till konsolen.

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

Metodtips

Det här avsnittet innehåller några riktlinjer för bästa praxis för att ställa in ACL:er rekursivt.

Hantera körningsfel

Ett körningsfel kan inträffa av många orsaker (till exempel ett avbrott eller ett problem med klientanslutningen). Om du stöter på ett körningsfel startar du om den rekursiva ACL-processen. ACL:er kan tillämpas på objekt igen utan att orsaka en negativ inverkan.

Hantera behörighetsfel (403)

Om du stöter på ett undantag för åtkomstkontroll när du kör en rekursiv ACL-process kanske ditt AD-säkerhetsobjekt inte har tillräcklig behörighet för att tillämpa en ACL på ett eller flera av de underordnade objekten i kataloghierarkin. När ett behörighetsfel inträffar stoppas processen och en fortsättningstoken tillhandahålls. Åtgärda behörighetsproblemet och använd sedan fortsättningstoken för att bearbeta den återstående datauppsättningen. Katalogerna och filerna som redan har bearbetats behöver inte bearbetas igen. Du kan också välja att starta om den rekursiva ACL-processen. ACL:er kan tillämpas på objekt igen utan att orsaka en negativ inverkan.

Autentiseringsuppgifter

Vi rekommenderar att du etablerar ett Microsoft Entra-säkerhetsobjekt som har tilldelats rollen Storage Blob Data Owner i omfånget för mållagringskontot eller containern.

Prestanda

För att minska svarstiden rekommenderar vi att du kör den rekursiva ACL-processen på en virtuell Azure-dator (VM) som finns i samma region som ditt lagringskonto.

ACL-gränser

Det maximala antalet ACL:er som du kan använda för en katalog eller fil är 32 åtkomst-ACL:er och 32 standard-ACL:er. Mer information finns i Åtkomstkontroll i Azure Data Lake Storage Gen2.

Se även