إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تُبين هذه المقالة كيفية استخدام Java للحصول على قوائم التحكم في الوصول للأدلة والملفات وضبطها وتحديثها.
يتوفر توريث قائمة التحكم بالوصول بالفعل للعناصر التابعة الجديدة التي تم إنشاؤها ضمن الدليل الأصل. ولكن يمكنك أيضًا إضافة قوائم التحكم في الوصول وتحديثها وإزالتها بشكل متكرر على العناصر التابعة الموجودة في دليل أصل دون الحاجة إلى إجراء هذه التغييرات بشكل فردي لكل عنصر تابع.
حزمة | عينات | مرجع واجهة برمجة التطبيقات | الجيل الأول لرسم خرائط الجيل الثاني | تقديم الملاحظات
المتطلبات الأساسية
- اشتراك في Azure - أنشئ اشتراكا مجانًا.
- حساب تخزين Azure الذي تم تمكين مساحة الاسم الهرمية (HNS). اتبع هذه الإرشادات لإنشاء واحدة.
- Java Development Kit (SDK) الإصدار 8 أو أحدث.
- يتم استخدام Apache Maven لإدارة المشاريع في هذا المثال.
- إصدار Azure CLI
2.6.0أو أعلى. - أحد أذونات الأمان التالية:
- أساس أمان معرف Microsoft Entra تم توفيره تم تعيينه لدور "مالك بيانات كائن ثنائي كبير الحجم للتخزين"، تم تحديد نطاقه للحاوية الهدف أو حساب التخزين أو مجموعة الموارد الأصل أو الاشتراك.
- امتلاك مستخدم للحاوية أو الدليل المستهدف الذي تخطط لتطبيق إعدادات قائمة التحكم بالوصول عليه. لتعيين ACLs بشكل متكرر، يشمل ذلك جميع العناصر الفرعية في الحاوية أو الدليل الهدف.
- مفتاح حساب التخزين.
إعداد مشروعك
إشعار
تستخدم هذه المقالة أداة بناء Maven لإنشاء وتشغيل نموذج التعليمات البرمجية. تعمل أدوات البناء الأخرى، مثل Gradle، أيضا مع Azure SDK ل Java.
استخدم Maven لإنشاء تطبيق وحدة تحكم جديد، أو افتح مشروعا موجودا. اتبع هذه الخطوات لتثبيت الحزم وإضافة التوجيهات الضرورية import .
تثبيت الحزم
افتح الملف pom.xml في محرر النصوص الخاص بك. قم بتثبيت الحزم عن طريق تضمين ملف BOM، أو تضمين تبعية مباشرة.
تضمين ملف BOM
أضف azure-sdk-bom للحصول على تبعية على أحدث إصدار من المكتبة. في القصاصة البرمجية التالية، استبدل {bom_version_to_target} العنصر النائب برقم الإصدار. استخدام azure-sdk-bom يمنعك من الاضطرار إلى تحديد إصدار كل تبعية فردية. لمعرفة المزيد حول قائمة مكونات الصنف، راجع README ل Azure SDK BOM.
<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>
أضف عناصر التبعية التالية إلى مجموعة التبعيات. تبعية azure-identity مطلوبة للاتصالات بدون كلمة مرور بخدمات Azure.
<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>
تضمين تبعية مباشرة
للحصول على تبعية على إصدار معين من المكتبة، أضف التبعية المباشرة إلى مشروعك:
<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>
تضمين توجيهات الاستيراد
أضف التوجيهات الضرورية import . في هذا المثال، نضيف التوجيهات التالية في ملف App.java :
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 الذي يمثل حساب التخزين. يمكنك تخويل كائن العميل باستخدام بيانات اعتماد معرف Microsoft Entra أو باستخدام مفتاح حساب.
يمكنك استخدام مكتبة عميل هوية Azure ل Java لمصادقة التطبيق الخاص بك باستخدام معرف Microsoft Entra.
أولا، سيتعين عليك تعيين أحد أدوار التحكم في الوصول المستندة إلى دور Azure (Azure RBAC) التالية إلى أساس الأمان الخاص بك:
| الدور | إمكانية إعداد قائمة التحكم بالوصول |
|---|---|
| مالك بيانات للبيانات الثنائية الكبيرة للتخزين | جميع الدلائل والملفات في الحساب. |
| المساهم في بيانات مخزن البيانات الثنائية الكبيرة | فقط الدلائل والملفات التي يملكها الأمان الأساسي. |
بعد ذلك، قم بإنشاء مثيل DataLakeServiceClient وتمرير مثيل جديد من فئة 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;
}
لمعرفة المزيد حول استخدام DefaultAzureCredential لتخويل الوصول إلى البيانات، راجع مكتبة عميل Azure Identity ل Java.
تعيين قوائم التحكم في الوصول
عند تعيين ACL، يمكنك استبدال قائمة التحكم بالوصول بأكملها بما في ذلك جميع إدخالاتها. إذا كنت ترغب في تغيير مستوى الإذن الخاص بمدير الأمان أو إضافة مدير أمان جديد إلى قائمة تحكم بالوصول دون التأثير على الإدخالات الموجودة الأخرى، فيجب عليك تحديث قائمة التحكم بالوصول بدلاً من ذلك. لتحديث قائمة التحكم بالوصول بدلاً من استبدالها، راجع قسم تحديث قوائم التحكم بالوصول من هذه المقالة.
إذا اخترت تعيين قائمة التحكم بالوصول، يجب عليك إضافة إدخال للمستخدم المالك وإدخال للمجموعة المالكة وإدخال لجميع المستخدمين الآخرين. لمعرفة المزيد عن المستخدم المالك والمجموعة المالكة وجميع المستخدمين الآخرين، راجع المستخدمين والهويات.
يوضح لك هذا القسم كيفية:
- تعيين قائمة التحكم بالوصول (ACL) لدليل
- تعيين قائمة التحكم بالوصول (ACL) لملف
- تعيين قوائم التحكم في الوصول بشكل متكرر
تعيين قائمة التحكم بالوصول (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 بشكل متكرر عن طريق الاتصال بطريقة DataLakeDirectoryClient.setAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.
إذا كنت ترغب في تعيين إدخال ACL الافتراضي، فيمكنك استدعاء طريقة setDefaultScope من PathAccessControlEntry وتمرير قيمة true.
يُعين هذا المثال قائمة التحكم بالوصول لدليل يُسمى my-parent-directory. يقبل هذا الأسلوب معلمة منطقية تُسمى isDefaultScope التي تحدد ما إذا كان سيتم تعيين ACL الافتراضي أم لا. يتم استخدام هذه المعلمة في كل مكالمة لطريقة setDefaultScope من PathAccessControlEntry. تتيح إدخالات ACL للمستخدم المالك قراءة الأذونات وكتابتها وتنفيذها، وتمنح المجموعة المالكة فقط قراءة الأذونات وتنفيذها، ولا تمنح جميع الآخرين حق الوصول. يعطي إدخال قائمة التحكم في الوصول الأخير في هذا المثال مستخدما معينا لديه معرف الكائن "xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx.
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 من الدليل عن طريق الاتصال بطريقة 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 .
تحديث قوائم التحكم في الوصول بشكل متكرر
لتحديث قائمة التحكم بالوصول بشكل متكرر، أنشئ عنصر ACL جديداً باستخدام إدخال ACL الذي تريد تحديثه، ثم استخدم هذا الكائن في عملية قائمة التحكم بالوصول المحدثة. لا تحصل على ACL الموجود، ما عليك سوى توفير إدخالات ACL ليتم تحديثها.
قم بتحديث ACLs بشكل متكرر عن طريق الاتصال بطريقة DataLakeDirectoryClient.updateAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.
إذا كنت ترغب في تحديث إدخال ACL افتراضي ، يمكنك استدعاء أسلوب setDefaultScope ل PathAccessControlEntry وتمرير قيمة true.
يقوم هذا المثال بتحديث إدخال قائمة التحكم في الوصول بإذن كتابة. يقبل هذا الأسلوب معلمة منطقية تُسمى 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 من الدليل عن طريق الاتصال بطريقة 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 عن طريق الاتصال بطريقة DataLakeDirectoryClient.removeAccessControlRecursive . مرر هذه الطريقة قائمة من عناصر PathAccessControlEntry . كل PathAccessControlEntry يحدد إدخال ACL.
إذا كنت ترغب في إزالة إدخال ACL افتراضي ، يمكنك استدعاء أسلوب setDefaultScope ل PathAccessControlEntry وتمرير قيمة true.
يزيل هذا المثال إدخال ACL من قائمة التحكم بالوصول للدليل المسمى my-parent-directory. تقبل هذه الطريقة الضابط المنطقي المُسمى isDefaultScope التي تحدد ما إذا كان سيتم إزالة الإدخال من قائمة التحكم في الوصول الافتراضية. يتم استخدام هذه المعلمة في الاتصال بطريقة 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);
}
التعافي من حالات الفشل
قد تواجه أخطاء وقت التشغيل أو الأذونات. بالنسبة لأخطاء وقت التشغيل، أعد تشغيل العملية من البداية. يمكن أن تحدث أخطاء الأذونات إذا لم يكن لدى الأمان الأساسي إذن كافٍ لتعديل قائمة التحكم بالوصول لدليل أو ملف موجود في التدرج الهرمي للدليل الذي يتم تعديله. عالج مشكلة الأذونات، ثم اختر إما استئناف العملية من نقطة الفشل باستخدام رمز المتابعة المميز أو إعادة تشغيل العملية من البداية. ليس عليك استخدام رمز المتابعة المميز إذا كنت تفضل إعادة التشغيل من البداية. يمكنك إعادة تطبيق إدخالات قائمة التحكم بالوصول دون أي تأثير سلبي.
يُرجع هذا المثال رمز المتابعة المميز في حالة حدوث فشل. يمكن للتطبيق استدعاء أسلوب المثال هذا مرة أخرى بعد معالجة الخطأ، وتمرير رمز المتابعة المميز. في حالة استدعاء أسلوب المثال هذا لأول مرة، يمكن أن يُمرر التطبيق قيمة 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.
يُعين هذا المثال إدخالات قائمة التحكم بالوصول بشكل متكرر. إذا واجهت هذه التعليمة البرمجية خطأً في الأذونات، فإنه يسجل هذا الفشل ويستمر التنفيذ. يطبع هذا المثال عدد حالات الفشل في وحدة التحكم.
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());
}
أفضل الممارسات
يوفر لك هذا القسم بعض إرشادات أفضل الممارسات لإعداد قوائم التحكم بالوصول بشكل متكرر.
التعامل مع أخطاء وقت التشغيل
يمكن أن يحدث خطأ في وقت التشغيل لأسباب عديدة (على سبيل المثال: انقطاع أو مشكلة في اتصال العميل). إذا واجهت خطأ وقت التشغيل، فأعد تشغيل عملية قائمة التحكم بالوصول المتكررة. يمكن إعادة تطبيق قوائم التحكم بالوصول على العناصر دون التسبب في تأثير سلبي.
معالجة أخطاء الأذونات (403)
إذا واجهت استثناءً للتحكم في الوصول أثناء تشغيل عملية ACL متكررة، فقد لا يكون لدى AD خاصتك إذنًا كافيًا لتطبيق ACL على واحد أو أكثر من العناصر التابعة في التسلسل الهرمي للدليل. عند حدوث خطأ في الإذن، تتوقف العملية ويتم توفير رمز مميز للمتابعة. عالج مشكلة الأذونات، ثم استخدم رمز المتابعة المميز لمعالجة مجموعة البيانات المتبقية. لن تُعالج الدلائل والملفات التي تمت معالجتها بنجاح بالفعل مرة أخرى. يمكنك أيضاً اختيار إعادة تشغيل عملية قائمة التحكم بالوصول المتكررة. يمكن إعادة تطبيق قوائم التحكم بالوصول على العناصر دون التسبب في تأثير سلبي.
بيانات الاعتماد
نوصي بتوفير أساس أمان Microsoft Entra الذي تم تعيينه لدور Storage Blob Data Owner في نطاق حساب التخزين الهدف أو الحاوية.
الأداء
لتقليل زمن الانتقال، نوصي بتشغيل عملية ACL المتكررة في جهاز Azure Virtual Machine (VM) الموجود في نفس منطقة حساب التخزين خاصتك.
حدود ACL
الحد الأقصى لعدد قوائم التحكم في الوصول التي يمكنك تطبيقها على دليل أو ملف هو 32 قائمة تحكم بالوصول و32 قائمة تحكم بالوصول افتراضية. لمزيد من المعلومات، راجع التحكم في الوصول في Azure Data Lake Storage Gen2.