Aracılığıyla paylaş


Azure Data Lake Storage'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 ögeler için daha önce kullanıma sunulmuştur. 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

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.
  • Hiyerarşik ad alanı (HNS) etkinleştirilmiş Azure depolama hesabı. Bir tane oluşturmak için bu yönergeleri izleyin.
  • Java Development Kit (JDK) sürüm 8 veya üzeri.
  • Apache Maven bu örnekte proje yönetimi için kullanılır.
  • 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 sağlanan bir Microsoft Entra ID güvenlik sorumlusu olan ve ona Depolama Blobu Veri Sahibi rolü atanmış birim.
    • ACL ayarlarını uygulamayı planladığınız hedef kapsayıcının veya dizinin sahibi olan kullanıcı. ACL'leri özyinelemeli olarak ayarlamak, hedef kapsayıcı veya dizindeki tüm alt öğelerin dahil edilmesini sağlar.
    • Depolama hesabı anahtarı.

Projenizi ayarlama

Not

Bu makalede, örnek kodu derlemek ve çalıştırmak için Maven derleme aracı kullanılır. Gradle gibi diğer derleme araçları da Java için Azure SDK ile çalışır.

Maven'ı kullanarak yeni bir konsol uygulaması oluşturun veya var olan bir projeyi açın. Paketleri yüklemek ve gerekli import yönergeleri eklemek için bu adımları izleyin.

Paketleri yükleme

pom.xml Dosyayı metin düzenleyicinizde açın. BOM dosyasını dahil ederek veya doğrudan bağımlılığı ekleyerek paketleri yükleyin.

BOM dosyasını dahil et

Kitaplığın en son sürümüne bağımlılık oluşturmak için azure-sdk-bom ekleyin. Aşağıdaki kod parçacığında yer tutucuyu {bom_version_to_target} sürüm numarasıyla değiştirin. azure-sdk-bom kullanmak, her bir bağımlılığın sürümünü belirtmenize gerek kalmamanızı sağlar. BOM hakkında daha fazla bilgi edinmek için Azure SDK BOM README'ya bakın.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-sdk-bom</artifactId>
            <version>{bom_version_to_target}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Bağımlılık grubuna aşağıdaki bağımlılık öğelerini ekleyin. Azure hizmetlerine parolasız bağlantılar için azure-identity bağımlılığı gereklidir.

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-file-datalake</artifactId>
</dependency>
<dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-common</artifactId>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
</dependency>

Doğrudan bağımlılık ekleme

Kitaplığın belirli bir sürümüne bağımlılığı almak için doğrudan bağımlılığı projenize ekleyin:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-file-datalake</artifactId>
    <version>{package_version_to_target}</version>
</dependency>
<dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-common</artifactId>
      <version>{package_version_to_target}</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>{package_version_to_target}</version>
</dependency>

İçeri aktarma yönergelerini dahil et

Gerekli import yönergeleri ekleyin. Bu örnekte, App.java dosyasına aşağıdaki yönergeleri ekleyeceğiz:

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ğlanma

Bu makaledeki kod örneklerini çalıştırmak için depolama hesabını temsil eden bir DataLakeServiceClient örneği oluşturmanız gerekir. İstemci nesnesini Microsoft Entra Id kimlik bilgileriyle veya bir hesap anahtarıyla yetkilandırabilirsiniz.

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 Blobu Veri Katılımcısı 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 kullanmaya ilişkin daha fazla bilgi edinmek için, Java için Azure Identity istemci kitaplığı'na bakın.

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'de değişiklik yaparsınız. Ö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üncellenecek 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 almadan, yalnızca kaldırılacak olan 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);      
  
  }

Başarısızlıklardan toparlanma

Ç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 uygulayabilirsiniz.

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 Blobu 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.