Share via


Azure Data Lake Storage 2. Nesil'da ACL'leri yönetmek için Java kullanma

Bu makalede, dizinlerin ve dosyaların erişim denetim listelerini almak, ayarlamak ve güncelleştirmek için Java'nın nasıl kullanılacağı gösterilmektedir.

ACL devralma, bir üst dizin altında oluşturulan yeni alt öğeler için zaten kullanılabilir. Ancak, her alt öğe için bu değişiklikleri tek tek yapmak zorunda kalmadan bir üst dizinin mevcut alt öğelerine ACL'leri yinelemeli olarak ekleyebilir, güncelleştirebilir ve kaldırabilirsiniz.

Paket (Maven) | Örnek | API başvurusu | 1. Nesil ile 2. Nesil eşlemesi | Geri Bildirim Ver

Ön koşullar

  • Azure aboneliği. Bkz. Azure ücretsiz deneme sürümü alma.

  • Hiyerarşik ad alanı (HNS) etkinleştirilmiş bir depolama hesabı. Oluşturmak için bu yönergeleri izleyin.

  • Azure CLI sürümü 2.6.0 veya üzeri.

  • Aşağıdaki güvenlik izinlerinden biri:

    • Hedef kapsayıcı, depolama hesabı, üst kaynak grubu veya abonelik kapsamında Depolama Blob Veri Sahibi rolü atanmış, sağlanan bir Microsoft Entra Id güvenlik sorumlusu..

    • ACL ayarlarını uygulamayı planladığınız hedef kapsayıcının veya dizinin sahibi olan kullanıcı. ACL'leri özyinelemeli olarak ayarlamak için, hedef kapsayıcıdaki veya dizindeki tüm alt öğeleri içerir.

    • hesap anahtarını Depolama.

Projenizi ayarlama

Başlamak için bu sayfayı açın ve Java kitaplığının en son sürümünü bulun. Ardından, metin düzenleyicinizde pom.xml dosyasını açın. Bu sürüme başvuran bir bağımlılık öğesi ekleyin.

Microsoft Entra Id kullanarak istemci uygulamanızın kimliğini doğrulamayı planlıyorsanız Azure Gizli Dizi İstemci Kitaplığı'na bir bağımlılık ekleyin. Bkz . Gizli İstemci Kitaplığı paketini projenize ekleme.

Ardından, bu içeri aktarma deyimlerini kod dosyanıza ekleyin.

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;

Hesaba Bağlan

Bu makaledeki kod parçacıklarını kullanmak için depolama hesabını temsil eden bir DataLakeServiceClient örneği oluşturmanız gerekir.

Microsoft Entra Id kullanarak Bağlan

Uygulamanızın kimliğini Microsoft Entra ID ile doğrulamak için Java için Azure kimlik istemci kitaplığını kullanabilirsiniz.

İlk olarak, güvenlik sorumlunuza aşağıdaki Azure rol tabanlı erişim denetimi (Azure RBAC) rollerinden birini atamanız gerekir:

Rol ACL ayarı özelliği
Depolama Blob Verileri Sahibi Hesaptaki tüm dizinler ve dosyalar.
Depolama Blob Verileri Katkıda Bulunanı Yalnızca güvenlik sorumlusuna ait dizinler ve dosyalar.

Ardından bir DataLakeServiceClient örneği oluşturun ve DefaultAzureCredential sınıfının yeni bir örneğini geçirin.

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

Verilere erişimi yetkilendirmek için DefaultAzureCredential kullanma hakkında daha fazla bilgi edinmek için bkz. Java için Azure Identity istemci kitaplığı.

Hesap anahtarı kullanarak Bağlan

Hesap erişim anahtarlarınızı (Paylaşılan Anahtar) kullanarak verilere erişim yetkisi vekleyebilirsiniz. Bu örnek, hesap anahtarıyla yetkilendirilmiş bir DataLakeServiceClient örneği oluşturur.

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

Dikkat

Daha az güvenli olabileceği için Paylaşılan Anahtar ile yetkilendirme önerilmez. En iyi güvenlik için, Azure Depolama hesabı için Paylaşılan Anahtar yetkilendirmesini engelleme bölümünde açıklandığı gibi depolama hesabınız için Paylaşılan Anahtar aracılığıyla yetkilendirmeyi devre dışı bırakın.

Erişim anahtarlarının ve bağlantı dizesi kullanımı, üretim veya hassas verilere erişmeyen ilk kavram kanıtı uygulamaları veya geliştirme prototipleriyle sınırlandırılmalıdır. Aksi takdirde, Azure kaynaklarında kimlik doğrulaması yapılırken Azure SDK'da bulunan belirteç tabanlı kimlik doğrulama sınıfları her zaman tercih edilmelidir.

Microsoft, istemcilerin Azure Depolama'daki verilere erişim yetkisi vermek için Microsoft Entra Id veya paylaşılan erişim imzası (SAS) kullanmasını önerir. Daha fazla bilgi için bkz . Veri erişimi için işlemleri yetkilendirme.

ACL'leri ayarlama

Bir ACL ayarladığınızda, tüm girdileri dahil olmak üzere ACL'nin tamamını değiştirirsiniz. Bir güvenlik sorumlusunun izin düzeyini değiştirmek veya var olan diğer girişleri etkilemeden ACL'ye yeni bir güvenlik sorumlusu eklemek istiyorsanız, bunun yerine ACL'yi güncelleştirmeniz gerekir. ACL'yi değiştirmek yerine güncelleştirmek için bu makalenin ACL'leri güncelleştirme bölümüne bakın.

ACL'yi ayarlamayı seçerseniz, sahip olan kullanıcı için bir girdi, sahip olan grup için bir girdi ve diğer tüm kullanıcılar için bir girdi eklemeniz gerekir. Sahip olan kullanıcı, sahip olan grup ve diğer tüm kullanıcılar hakkında daha fazla bilgi edinmek için bkz . Kullanıcılar ve kimlikler.

Bu bölümde şunların nasıl yapıldığını görebilirsiniz:

  • Dizinin ACL'sini ayarlama
  • Dosyanın ACL'sini ayarlama
  • ACL’leri özyinelemeli olarak belirleme

Dizinin ACL'sini ayarlama

Bu örnek, adlı my-directorydizinin ACL'sini alır ve ayarlar. Bu örnek, sahip olan kullanıcıya okuma, yazma ve yürütme izinleri verir, sahip olan gruba yalnızca okuma ve yürütme izinleri verir ve diğer tüm kullanıcılara okuma erişimi verir.

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

  }

Ayrıca bir kapsayıcının kök dizininin ACL'sini alabilir ve ayarlayabilirsiniz. Kök dizini almak için DataLakeFileSystemClient.getDirectoryClient yöntemine boş bir dize ("") geçirin.

Dosyanın ACL'sini ayarlama

Bu örnek, adlı upload-file.txtbir dosyanın ACL'sini alır ve ayarlar. Bu örnek, sahip olan kullanıcıya okuma, yazma ve yürütme izinleri verir, sahip olan gruba yalnızca okuma ve yürütme izinleri verir ve diğer tüm kullanıcılara okuma erişimi verir.

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

 }

ACL’leri özyinelemeli olarak belirleme

DataLakeDirectoryClient.setAccessControlRecursive yöntemini çağırarak ACL'leri özyinelemeli olarak ayarlayın. Bu yönteme PathAccessControlEntry nesnelerinin listesini geçirin. Her PathAccessControlEntry bir ACL girdisi tanımlar.

Varsayılan bir ACL girdisi ayarlamak istiyorsanız, PathAccessControlEntry'nin setDefaultScope yöntemini çağırabilir ve true değerini geçirebilirsiniz.

Bu örnek adlı my-parent-directorydizinin ACL'sini ayarlar. Bu yöntem, varsayılan ACL'nin ayarlanıp ayarlanmayacağını belirten adlı isDefaultScope boole parametresini kabul eder. Bu parametre, PathAccessControlEntry'nin setDefaultScope yöntemine yapılan her çağrıda kullanılır. ACL'nin girişleri sahip olan kullanıcıya okuma, yazma ve yürütme izinleri verir, sahip olan gruba yalnızca okuma ve yürütme izinleri verir ve diğer tüm kullanıcılara erişim vermez. Bu örnekteki son ACL girdisi, "xxxxx-xxxx-xxxx-xxxx" nesne kimliğine sahip belirli bir kullanıcıya okuma ve yürütme izinleri verir.

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

}

ACL'leri güncelleştirme

Bir ACL'yi güncelleştirdiğinizde, ACL'yi değiştirmek yerine ACL'yi değiştirirsiniz. Örneğin, ACL'de listelenen diğer güvenlik sorumlularını etkilemeden ACL'ye yeni bir güvenlik sorumlusu ekleyebilirsiniz. ACL'yi güncelleştirmek yerine değiştirmek için bu makalenin ACL'leri ayarlama bölümüne bakın.

Bu bölümde şunların nasıl yapıldığını görebilirsiniz:

  • ACL'yi güncelleştirme
  • ACL'leri özyinelemeli olarak güncelleştirme

ACL'yi güncelleştirme

İlk olarak, PathAccessControl.getAccessControlList yöntemini çağırarak dizinin ACL'sini alın. ACL girdilerinin listesini PathAccessControlListEntry türünde yeni bir List nesnesine kopyalayın. Ardından, güncelleştirmek istediğiniz girdiyi bulun ve listeden değiştirin. DataLakeDirectoryClient.setAccessControlList yöntemini çağırarak ACL'yi ayarlayın.

Bu örnek, diğer tüm kullanıcıların girdisini değiştirerek adlı my-parent-directory dizinin ACL'sini güncelleştirir.

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

Ayrıca bir kapsayıcının kök dizininin ACL'sini alabilir ve ayarlayabilirsiniz. Kök dizini almak için DataLakeFileSystemClient.getDirectoryClient yöntemine boş bir dize ("") geçirin.

ACL'leri özyinelemeli olarak güncelleştirme

Bir ACL'yi özyinelemeli olarak güncelleştirmek için, güncelleştirmek istediğiniz ACL girişiyle yeni bir ACL nesnesi oluşturun ve ardından bu nesneyi güncelleştirme ACL işleminde kullanın. Mevcut ACL'yi almayın, yalnızca güncelleştirilecek ACL girdilerini sağlayın.

DataLakeDirectoryClient.updateAccessControlRecursive yöntemini çağırarak ACL'leri özyinelemeli olarak güncelleştirin . Bu yönteme PathAccessControlEntry nesnelerinin listesini geçirin. Her PathAccessControlEntry bir ACL girdisi tanımlar.

Varsayılan bir ACL girdisini güncelleştirmek istiyorsanız, PathAccessControlEntry'nin setDefaultScope yöntemini çağırabilir ve true değerini geçirebilirsiniz.

Bu örnek, yazma iznine sahip bir ACL girdisi güncelleştirir. Bu yöntem, varsayılan ACL'nin güncelleştirilip güncelleştirilmeyeceğini belirten adlı isDefaultScope boole parametresini kabul eder. Bu parametre, PathAccessControlEntry'nin setDefaultScope yöntemine yapılan çağrıda kullanılır.

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

}

ACL girdilerini kaldırma

Bir veya daha fazla ACL girdisini kaldırabilirsiniz. Bu bölümde şunların nasıl yapıldığını görebilirsiniz:

  • ACL girdisini kaldırma
  • ACL girdilerini özyinelemeli olarak kaldırma

ACL girdisini kaldırma

İlk olarak, PathAccessControl.getAccessControlList yöntemini çağırarak dizinin ACL'sini alın. ACL girdilerinin listesini PathAccessControlListEntry türünde yeni bir List nesnesine kopyalayın. Ardından kaldırmak istediğiniz girdiyi bulun ve List nesnesinin Remove yöntemini çağırın. DataLakeDirectoryClient.setAccessControlList yöntemini çağırarak güncelleştirilmiş ACL'yi ayarlayın.

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

 
 }

ACL girdilerini özyinelemeli olarak kaldırma

ACL girdilerini özyinelemeli olarak kaldırmak için, kaldırılacak ACL girdisi için yeni bir ACL nesnesi oluşturun ve ardından bu nesneyi ACL'yi kaldırma işleminde kullanın. Mevcut ACL'yi almayın, yalnızca kaldırılacak ACL girdilerini sağlayın.

DataLakeDirectoryClient.removeAccessControlRecursive yöntemini çağırarak ACL girdilerini kaldırın. Bu yönteme PathAccessControlEntry nesnelerinin listesini geçirin. Her PathAccessControlEntry bir ACL girdisi tanımlar.

Varsayılan bir ACL girdisini kaldırmak istiyorsanız, PathAccessControlEntry'nin setDefaultScope yöntemini çağırabilir ve true değerini geçirebilirsiniz.

Bu örnek, adlı my-parent-directorydizinin ACL'sinden bir ACL girdisini kaldırır. Bu yöntem, girdinin varsayılan ACL'den kaldırılıp kaldırılmayacağını belirten adlı isDefaultScope boole parametresini kabul eder. Bu parametre, PathAccessControlEntry'nin setDefaultScope yöntemine yapılan çağrıda kullanılır.

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

Hatalardan kurtarma

Çalışma zamanı veya izin hatalarıyla karşılaşabilirsiniz. Çalışma zamanı hataları için, işlemi baştan yeniden başlatın. Güvenlik sorumlusunun değiştirilmekte olan dizin hiyerarşisindeki bir dizin veya dosyanın ACL'sini değiştirmek için yeterli izni yoksa izin hataları oluşabilir. İzin sorununu giderin ve devam belirteci kullanarak işlemi hata noktasından sürdürmeyi veya işlemi baştan yeniden başlatmayı seçin. Baştan yeniden başlatmayı tercih ediyorsanız devamlılık belirtecini kullanmanız gerekmez. ACL girişlerini herhangi bir olumsuz etki olmadan yeniden uygulayın.

Bu örnek, hata durumunda bir devamlılık belirteci döndürür. Uygulama, hata giderildikten sonra bu örnek yöntemi yeniden çağırabilir ve devamlılık belirtecini geçirebilir. Bu örnek yöntem ilk kez çağrılırsa, uygulama devamlılık belirteci parametresi için değerini null geçirebilir.

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


}

İşlemin izin hataları tarafından kesintisiz tamamlanmasını istiyorsanız, bunu belirtebilirsiniz.

İşlemin kesintisiz tamamlanmasını sağlamak için pathSetAccessControlRecursiveOptions nesnesinin setContinueOnFailure yöntemini çağırın ve true değerini geçirin.

Bu örnek, ACL girdilerini özyinelemeli olarak ayarlar. Bu kod bir izin hatasıyla karşılaşırsa, bu hatayı kaydeder ve yürütmeye devam eder. Bu örnek, konsoldaki hata sayısını yazdırır.

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

En iyi yöntemler

Bu bölümde, ACL'leri özyinelemeli olarak ayarlamak için bazı en iyi yöntem yönergeleri sağlanır.

Çalışma zamanı hatalarını işleme

Çalışma zamanı hatası birçok nedenden oluşabilir (Örneğin: kesinti veya istemci bağlantısı sorunu). Çalışma zamanı hatasıyla karşılaşırsanız özyinelemeli ACL işlemini yeniden başlatın. ACL'ler olumsuz bir etkiye neden olmadan öğelere yeniden uygulanabilir.

İzin hatalarını işleme (403)

Özyinelemeli bir ACL işlemi çalıştırırken erişim denetimi özel durumuyla karşılaşırsanız, AD güvenlik sorumlunuz dizin hiyerarşisindeki bir veya daha fazla alt öğeye ACL uygulamak için yeterli izne sahip olmayabilir. İzin hatası oluştuğunda işlem durdurulur ve bir devam belirteci sağlanır. İzin sorununu düzeltin ve kalan veri kümesini işlemek için devamlılık belirtecini kullanın. Zaten başarıyla işlenen dizinlerin ve dosyaların yeniden işlenmesi gerekmez. Özyinelemeli ACL işlemini yeniden başlatmayı da seçebilirsiniz. ACL'ler olumsuz bir etkiye neden olmadan öğelere yeniden uygulanabilir.

Kimlik Bilgileri

Hedef depolama hesabı veya kapsayıcı kapsamında Depolama Blob Veri Sahibi rolü atanmış bir Microsoft Entra güvenlik sorumlusu sağlamanızı öneririz.

Performans

Gecikme süresini azaltmak için, özyinelemeli ACL işlemini depolama hesabınızla aynı bölgede bulunan bir Azure Sanal Makinesi'nde (VM) çalıştırmanızı öneririz.

ACL sınırları

Bir dizine veya dosyaya uygulayabileceğiniz maksimum ACL sayısı 32 erişim ACL'leri ve 32 varsayılan ACL'dir. Daha fazla bilgi için bkz. Azure Data Lake Storage 2. Nesil'de erişim denetimi.

Ayrıca bkz.