استخدام Java لإدارة عناوين AC في Azure Data Lake Storage Gen2

تُبين هذه المقالة كيفية استخدام Java للحصول على قوائم التحكم في الوصول للأدلة والملفات وضبطها وتحديثها.

توريث ACL متاح بالفعل للعناصر الفرعية الجديدة التي تم إنشاؤها بموجب الدليل الأصلي. ولكن يمكنك أيضًا إضافة ACLs وتحديثها وإزالتها بشكل متكرر على العناصر الفرعية الموجودة في الدليل الأصلي دون الحاجة إلى إجراء هذه التغييرات بشكل فردي لكل عنصر تابع.

حزمة | عينات | مرجع واجهة برمجة التطبيقات | الجيل الأول لرسم خرائط الجيل الثاني | تقديم الملاحظات

المتطلبات الأساسية

  • اشتراك Azure. راجع الحصول على الإصدار التجريبي المجاني من Azure .

  • حساب تخزين به مساحة أسماء هرمية (HNS) ممكّنة. اتبع هذه التعليمات لإنشاء واحدة.

  • إصدار Azure CLI2.6.0 أو أعلى.

  • أحد أذونات الأمان التالية:

    • مدير أمان Azure Active Directory (AD) تم توفيره وتم تعيينه دور مالك بيانات كائن ثنائي كبير الحجم التخزين في نطاق الحاوية الهدف أو مجموعة الموارد الأصلية أوالاشتراك.

    • امتلاك مستخدم للحاوية أو الدليل الهدف الذي تخطط لتطبيق إعدادات ACL عليه. لتعيين ACLs بشكل متكرر، يشمل ذلك جميع العناصر التابعة في الحاوية أو الدليل الهدف.

    • مفتاح حساب التخزين.

إعداد مشروعك

للبدء، افتح هذه الصفحة وابحث عن أحدث إصدار من مكتبة Java. افتح الملف pom.xml في محرر النصوص خاصتك. أضف عنصر التبعية الذي يشير إلى هذا الإصدار.

إذا كنت تخطط لمصادقة تطبيق العميل خاصتك باستخدام Azure Active Directory (AD )، فقم بإضافة تبعية إلى مكتبة عميل Azure Secret. راجع إضافة حزمة مكتبة العميل السرية إلى مشروعك.

بعد ذلك، أضف عبارات الاستيراد هذه إلى ملف التعليمات البرمجية خاصتك.

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;

الاتصال بالحساب

لاستخدام المقتطفات الموجودة في هذه المقالة، ستحتاج إلى إنشاء مثيل DataLakeServiceClient يمثل حساب التخزين.

الاتصال باستخدام Azure Active Directory (Azure AD)

يمكنك استخدام مكتبة عميل هوية Azure إلى Java لمصادقة تطبيقك باستخدام Azure AD.

احصل على ID عميل وسر عميل وID مستأجر. للقيام بذلك، راجع الحصول على رمز من Azure AD للتصريح بالطلبات من تطبيق العميل . كجزء من هذه العملية، سيتعين عليك تعيين أحد الأدوار كجزء من هذه العملية، سيتعين عليك تعيين أحد أدوار التحكم في الوصول (Azure RBAC) التالية في Azure إلى مدير الأمان خاصتك.

الدور إمكانية إعداد ACL
⁩مالك بيانات كائن ثنائي كبير الحجم للتخزين⁧ جميع الأدلة والملفات في الحساب.
مساهم بيانات للبيانات الثنائية الكبيرة للتخزين فقط الأدلة والملفات التي يملكها مدير الأمن.

ينشئ هذا المثال مثال DataLakeServiceClient باستخدام ID العميل وسر العميل و ID المستأجر.

static public DataLakeServiceClient GetDataLakeServiceClient
    (String accountName, String clientId, String ClientSecret, String tenantID){

    String endpoint = "https://" + accountName + ".dfs.core.windows.net";
    
    ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
    .clientId(clientId)
    .clientSecret(ClientSecret)
    .tenantId(tenantID)
    .build();
       
    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
    return builder.credential(clientSecretCredential).endpoint(endpoint).buildClient();
}

ملاحظة

لمزيد من الأمثلة، راجع مكتبة عميل هوية Azure للحصول على وثائق Java.

الاتصال باستخدام مفتاح حساب

هذه أسهل طريقة للاتصال بحساب.

ينشئ هذا المثال مثيل DataLakeServiceClient باستخدام مفتاح حساب.

static public DataLakeServiceClient GetDataLakeServiceClient
(String accountName, String accountKey){

    StorageSharedKeyCredential sharedKeyCredential =
        new StorageSharedKeyCredential(accountName, accountKey);

    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();

    builder.credential(sharedKeyCredential);
    builder.endpoint("https://" + accountName + ".dfs.core.windows.net");

    return builder.buildClient();
}

تعيين ACLs

عند تعيين ACL، فإنك تستبدل ACL بالكامل بما في ذلك جميع إدخالاته. إذا كنت ترغب في تغيير مستوى الإذن الخاص بمدير الأمان أو إضافة مدير أمان جديد إلى ACL دون التأثير على الإدخالات الموجودة الأخرى، فيجب عليك تحديث ACL بدلاً من ذلك. لتحديث ACL بدلاً من استبدالها، راجع قسم تحديث ACLs من هذه المقالة.

إذا اخترت تعيين ACL، فيجب عليك إضافة إدخال للمستخدم المالك، وإدخال للمجموعة المالكة، وإدخال لجميع المستخدمين الآخرين. لمعرفة المزيد عن المستخدم المالك والمجموعة المالكة وجميع المستخدمين الآخرين، راجع المستخدمين والهويات.

يُبين لك هذا القسم كيفية:

  • تعيين ACL لدليل
  • تعيين ACL للملف
  • تعيين ACLs بشكل متكرر

تعيين ACL لدليل

يحصل هذا المثال على ACL لدليل مسمى my-directory ثم يقوم بتعيينه. يمنح هذا المثال المستخدم المالك الأذونات للقراءة والكتابة والتنفيذ، ويعطي المجموعة المالكة الأذونات للقراءة والتنفيذ فقط، ويعطي جميع الآخرين حق الوصول للقراءة.

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

  }

يمكنك أيضًا الحصول على ACL الخاص بالدليل الجذري للحاوية وتعيينه. للحصول على الدليل الجذري، مرر سلسلة فارغة ("") إلى طريقة DataLakeFileSystemClient.getDirectoryClient .

تعيين ACL للملف

يحصل هذا المثال على ACL لملف مسمى upload-file.txt ثم يقوم بتعيينه. يمنح هذا المثال المستخدم المالك الأذونات للقراءة والكتابة والتنفيذ، ويعطي المجموعة المالكة الأذونات للقراءة والتنفيذ فقط، ويعطي جميع الآخرين حق الوصول للقراءة.

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

 }

تعيين ACLs بشكل متكرر

قم بتعيين ACLs بشكل متكرر عن طريق الاتصال بطريقة DataLakeDirectoryClient.setAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.

إذا كنت ترغب في تعيين إدخال ACL الافتراضي، فيمكنك استدعاء طريقة setDefaultScope من PathAccessControlEntry وتمرير قيمة true.

يحدد هذا المثال ACL لدليل مسمى my-parent-directory. تقبل هذه الطريقة المعلمة المنطقية المسماة isDefaultScope التي تحدد ما إذا كان سيتم تعيين ACL الافتراضي. يتم استخدام هذه المعلمة في كل مكالمة لطريقة setDefaultScope من PathAccessControlEntry. تتيح إدخالات ACL للمستخدم المالك قراءة الأذونات وكتابتها وتنفيذها، وتمنح المجموعة المالكة فقط قراءة الأذونات وتنفيذها، ولا تمنح جميع الآخرين حق الوصول. يعطي آخر إدخال ACL في هذا المثال مستخدمًا محددًا بمعرف العنصر "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxx" قراءة وتنفيذ الأذونات.

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

}

تحديث ACLs

عند تحديث ACL، تقوم بتعديل ACL بدلاً من استبدال ACL. على سبيل المثال، يمكنك إضافة مبدأ أمان جديد إلى ACL دون التأثير على مبادئ الأمان الأخرى المدرجة في ACL. لاستبدال ACL بدلاً من تحديثها، راجع قسم تعيين ACLs من هذه المقالة.

يُبين لك هذا القسم كيفية:

  • تحديث ACL
  • تحديث ACLs بشكل متكرر

تحديث ACL

أولاً، احصل على ACL من الدليل عن طريق الاتصال بطريقة PathAccessControl.getAccessControlList. انسخ قائمة إدخالات ACL إلى قائمة عنصر جديد من نوع PathAccessControlListEntry. ثم حدد موقع الإدخال الذي تريد تحديثه واستبداله في القائمة. قم بتعيين ACL عن طريق استدعاء طريقة DataLakeDirectoryClient.setAccessControlList .

يقوم هذا المثال بتحديث ACL لدليل يسمى my-parent-directory عن طريق استبدال الإدخال لجميع المستخدمين الآخرين.

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

يمكنك أيضًا الحصول على ACL الخاص بالدليل الجذري للحاوية وتعيينه. للحصول على الدليل الجذري، مرر سلسلة فارغة ("") إلى طريقة DataLakeFileSystemClient.getDirectoryClient .

تحديث ACLs بشكل متكرر

لتحديث ACL بشكل متكرر، قم بإنشاء عنصر ACL جديد باستخدام إدخال ACL الذي تريد تحديثه، ثم استخدم هذا العنصر في تحديث عملية ACL. لا تحصل على ACL الموجود، ما عليك سوى توفير إدخالات ACL ليتم تحديثها.

قم بتحديث ACLs بشكل متكرر عن طريق الاتصال بطريقة DataLakeDirectoryClient.updateAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.

إذا كنت ترغب في تحديث إدخال ACL الافتراضي، فيمكنك setDefaultScope طريقة PathAccessControlEntry وتمرير قيمة true.

يقوم هذا المثال بتحديث إدخال ACL بإذن الكتابة. تقبل هذه الطريقة المعلمة المنطقية المسماة isDefaultScope التي تحدد ما إذا كان سيتم تحديث ACL الافتراضي. يتم استخدام هذه المعلمة في الاتصال بطريقة setDefaultScope من 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);        

}

إزالة إدخالات ACL

يمكنك إزالة واحد أو أكثر من إدخالات ACL. يُبين لك هذا القسم كيفية:

  • إزالة إدخال ACL
  • إزالة إدخالات ACL بشكل متكرر

إزالة إدخال ACL

أولاً، احصل على ACL من الدليل عن طريق الاتصال بطريقة PathAccessControl.getAccessControlList. انسخ قائمة إدخالات ACL إلى قائمة عنصر جديد من نوع PathAccessControlListEntry. ثم حدد الإدخال الذي تريد إزالته واتصل بطريقة إزالة عنصر القائمة. تعيين قائمة التحكم بالوصول المحدثة عن طريق استدعاء الأسلوب 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());   
     }

 
 }

إزالة إدخالات ACL بشكل متكرر

لإزالة إدخالات ACL بشكل متكرر، قم بإنشاء عنصر ACL جديد لإدخال ACL المراد إزالته، ثم استخدم هذا العنصر في إزالة عملية ACL. لا تحصل على ACL الموجود، ما عليك سوى توفير إدخالات ACL المراد إزالتها.

قم بإزالة إدخالات ACL عن طريق الاتصال بطريقة DataLakeDirectoryClient.removeAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.

إذا كنت ترغب في إزالة إدخال ACL الافتراضي، فيمكنك طريقة setDefaultScope من PathAccessControlEntry وتمرير قيمة true.

يزيل هذا المثال إدخال ACL من قائمة التحكم بالوصول للدليل المسمى my-parent-directory. تقبل هذه الطريقة المعلمة المنطقية المسماة isDefaultScope التي تحدد ما إذا كان سيتم إزالة الإدخال من ACL الافتراضي. يتم استخدام هذه المعلمة في الاتصال بطريقة setDefaultScope من 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);      
  
  }

التعافي من حالات الفشل

قد تواجه أخطاء في وقت التشغيل أو الإذن. بالنسبة لأخطاء وقت التشغيل، أعد تشغيل العملية من البداية. يمكن أن تحدث أخطاء في الإذن إذا لم يكن لدى مدير الأمان إذن كافٍ لتعديل ACL لدليل أو ملف موجود في التسلسل الهرمي للدليل الذي يتم تعديله. عالج مشكلة الأذونات، ثم اختر إما استئناف العملية من نقطة الفشل باستخدام رمز مميز للمتابعة، أو إعادة تشغيل العملية من البداية. لست مضطرًا لاستخدام رمز الاستمرار إذا كنت تفضل إعادة التشغيل من البداية. يمكنك إعادة تطبيق إدخالات ACL دون أي تأثير سلبي.

يعود هذا المثال برمز استمرار في حالة الفشل. يمكن أن يطلق التطبيق على هذه الطريقة التوضيحية مرة أخرى بعد معالجة الخطأ، ويمر في رمز الاستمرار. إذا تم استدعاء هذه الطريقة التوضيحية لأول مرة، فيمكن أن يمر التطبيق بقيمة null لمعلمة رمز الاستمرار.

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


}

إذا كنت ترغب في إكمال العملية دون انقطاع بسبب أخطاء في الإذن، فيمكنك تحديد ذلك.

لضمان اكتمال العملية دون انقطاع، اتصل بطريقة setContinueOnFailure لعنصر PathSetAccessControlRecursiveOptions واجتازها بقيمة true.

يقوم هذا المثال بتعيين إدخالات ACL بشكل متكرر. إذا واجه هذا الرمز خطأ في الإذن،إذا واجهت هذه التعليمة البرمجية خطأ في الأذونات، فإنه يسجل هذا الفشل ويستمر التنفيذ. يطبع هذا المثال عدد حالات الفشل في وحدة التحكم.

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

أفضل الممارسات

يوفر لك هذا القسم بعض إرشادات أفضل الممارسات لإعداد ACLs بشكل متكرر.

التعامل مع أخطاء وقت التشغيل

يمكن أن يحدث خطأ وقت التشغيل لعدة أسباب (على سبيل المثال: مشكلة انقطاع أو اتصال بالعميل). إذا واجهت خطأ في وقت التشغيل، فأعد تشغيل عملية ACL المتكررة. يمكن إعادة تطبيق ACLs على العناصر دون التسبب في تأثير سلبي.

التعامل مع أخطاء الإذن (403)

إذا واجهت استثناءً للتحكم في الوصول أثناء تشغيل عملية ACL متكررة، فقد لا يكون لدى AD خاصتك إذنًا كافيًا لتطبيق ACL على واحد أو أكثر من العناصر التابعة في التسلسل الهرمي للدليل. عند حدوث خطأ في الإذن، تتوقف العملية ويتم توفير رمز متابعة. قم بإصلاح مشكلة الإذن، ثم استخدم رمز الاستمرار لمعالجة مجموعة البيانات المتبقية. لن يكون من الضروري معالجة الأدلة والملفات التي تمت معالجتها بنجاح مرة أخرى. يمكنك أيضًا اختيار إعادة تشغيل عملية ACL المتكررة. يمكن إعادة تطبيق ACLs على العناصر دون التسبب في تأثير سلبي.

بيانات الاعتماد

نوصيك بتوفير مدير أمان Azure AD الذي تم تعيين دور مالك بيانات التخزين في نطاق حساب التخزين الهدف أو الحاوية.

الأداء

لتقليل زمن الانتقال، نوصي بتشغيل عملية ACL المتكررة في جهاز Azure Virtual Machine (VM) الموجود في نفس منطقة حساب التخزين خاصتك.

حدود ACL

الحد الأقصى لعدد ACLs الذي يمكنك تطبيقه على دليل أو ملف هو 32 الوصول إلى ACLs و 32 ACLs الافتراضية. لمزيد من المعلومات، راجع التحكم في الوصول في Azure Data Lake Storage Gen2.

راجع أيضًا