Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule pokazano, jak używać języka Java do pobierania, ustawiania i aktualizowania list kontroli dostępu katalogów i plików.
Dziedziczenie listy ACL jest już dostępne dla nowych elementów podrzędnych utworzonych w katalogu nadrzędnym. Można jednak również rekurencyjnie dodawać, aktualizować i usuwać listy kontroli dostępu (ACL) w istniejących elementach podrzędnych katalogu nadrzędnego, bez konieczności wprowadzania tych zmian osobno dla każdego elementu podrzędnego.
Pakiet (Maven) | Przykłady | Dokumentacja API | Mapowanie z Gen1 na Gen2 | Prześlij opinię
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- Konto usługi Azure Storage z włączoną hierarchiczną przestrzenią nazw (HNS). Postępuj zgodnie z tymi instrukcjami , aby je utworzyć.
- Zestaw Java Development Kit (JDK) w wersji 8 lub nowszej.
- Narzędzie Apache Maven jest używane do zarządzania projektami w tym przykładzie.
- Wersja Azure CLI
2.6.0lub wyższa. - Jedno z następujących uprawnień zabezpieczeń:
- Provisionowana jednostka zabezpieczeń Microsoft Entra ID, której przypisano rolę właściciela danych obiektu blob usługi Storage, z zakresem określonym na kontener docelowy, konto magazynu, nadrzędną grupę zasobów lub subskrypcję.
- Użytkownik będący właścicielem kontenera docelowego lub katalogu, do którego planujesz zastosować ustawienia ACL. Aby rekurencyjnie ustawić listy ACL, obejmuje to wszystkie elementy podrzędne w kontenerze docelowym lub katalogu.
- Klucz konta magazynowego.
konfigurowanie projektu
Uwaga
W tym artykule użyto narzędzia kompilacji Maven do skompilowania i uruchomienia przykładowego kodu. Inne narzędzia kompilacji, takie jak Gradle, współpracują również z zestawem Azure SDK dla języka Java.
Użyj narzędzia Maven, aby utworzyć nową aplikację konsolową lub otworzyć istniejący projekt. Wykonaj następujące kroki, aby zainstalować pakiety i dodać niezbędne import dyrektywy.
Instalowanie pakietów
pom.xml Otwórz plik w edytorze tekstów. Zainstaluj pakiety, dołączając plik BOM lub uwzględniając bezpośrednią zależność.
Uwzględnij plik BOM
Dodaj element azure-sdk-bom, aby dodać zależność od najnowszej wersji biblioteki. W poniższym fragmencie kodu zastąp {bom_version_to_target} symbol zastępczy numerem wersji. Korzystanie z azure-sdk-bom pozwala uniknąć konieczności określania wersji każdej z poszczególnych zależności. Aby dowiedzieć się więcej na temat BOM, zobacz 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>
Dodaj następujące elementy zależności do grupy zależności. Zależność azure-identity jest wymagana w przypadku połączeń bez hasła z usługami platformy 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>
Uwzględnij zależność bezpośrednią
Aby podjąć zależność od określonej wersji biblioteki, dodaj bezpośrednią zależność do projektu:
<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>
Uwzględnij dyrektywy importu
Dodaj niezbędne import dyrektywy. W tym przykładzie dodamy następujące dyrektywy w pliku 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;
Nawiązywanie połączenia z kontem
Aby uruchomić przykłady kodu w tym artykule, należy utworzyć wystąpienie DataLakeServiceClient, które będzie reprezentować konto magazynowe. Obiekt klienta można autoryzować przy użyciu poświadczeń Microsoft Entra ID lub klucza konta.
Możesz użyć biblioteki klienta tożsamości platformy Azure dla języka Java do uwierzytelniania aplikacji za pomocą identyfikatora Entra firmy Microsoft.
Najpierw musisz przypisać do podmiotu zabezpieczeń jedną z następujących ról kontroli dostępu na podstawie ról (RBAC) platformy Azure :
| Role | Możliwość ustawiania ACL |
|---|---|
| Właściciel danych obiektu blob Storage | Wszystkie katalogi i pliki na koncie. |
| Kontrybutor danych Storage Blob | Tylko katalogi i pliki należące do podmiotu zabezpieczeń. |
Następnie utwórz wystąpienie klasy DataLakeServiceClient i przekaż jako argument nowe wystąpienie klasy 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;
}
Aby dowiedzieć się więcej na temat autoryzowania DefaultAzureCredential dostępu do danych, zobacz Biblioteka klienta tożsamości platformy Azure dla języka Java.
Ustaw ACL
Kiedy ustawisz listę ACL, zastępujesz całą listę ACL wraz ze wszystkimi jej wpisami. Jeśli chcesz zmienić poziom uprawnień podmiotu zabezpieczeń lub dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne istniejące wpisy, należy zaktualizować listę ACL. Aby zaktualizować listę ACL zamiast jej zastąpić, zobacz sekcję Aktualizowanie list ACL w tym artykule.
Jeśli zdecydujesz się ustawić ACL, musisz dodać wpis dla użytkownika będącego właścicielem, wpis dla grupy będącej właścicielem i wpis dla wszystkich innych użytkowników. Aby dowiedzieć się więcej na temat użytkownika, grupy właścicieli i wszystkich innych użytkowników, zobacz Użytkownicy i tożsamości.
W tej sekcji pokazano, jak wykonać następujące działania:
- Ustaw ACL katalogu
- Ustaw ACL pliku
- Rekursywne ustawianie list kontroli dostępu
Ustaw ACL katalogu
Ten przykład pobiera i ustawia listę ACL katalogu o nazwie my-directory. W tym przykładzie użytkownikowi będącemu właścicielem nadawane są uprawnienia do odczytu, zapisu i wykonywania, grupie właściciela przyznaje się tylko uprawnienia do odczytu i wykonywania, a wszystkim innym dostęp do odczytu.
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));
}
Można również pobrać i ustawić listę ACL katalogu głównego kontenera. Aby uzyskać katalog główny, przekaż pusty ciąg ("") do metody DataLakeFileSystemClient.getDirectoryClient .
Ustaw ACL pliku
Ten przykład pobiera i ustawia listę ACL pliku o nazwie upload-file.txt. W tym przykładzie użytkownikowi będącemu właścicielem nadawane są uprawnienia do odczytu, zapisu i wykonywania, grupie właściciela przyznaje się tylko uprawnienia do odczytu i wykonywania, a wszystkim innym dostęp do odczytu.
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));
}
Rekursywne ustawianie list kontroli dostępu
Ustaw listy ACL rekursywnie, wywołując metodę DataLakeDirectoryClient.setAccessControlRecursive . Przekaż tej metodzie Listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis ACL.
Jeśli chcesz ustawić domyślny wpis listy ACL, możesz wywołać metodę setDefaultScope elementu PathAccessControlEntry i przekazać wartość true.
W tym przykładzie ustawiono listę kontroli dostępu (ACL) katalogu o nazwie my-parent-directory. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope, który określa, czy ustawić domyślną listę kontroli dostępu (ACL). Ten parametr jest używany w każdym wywołaniu metody setDefaultScope metody PathAccessControlEntry. Wpisy listy ACL dają właścicielowi uprawnienia do odczytu, zapisu i wykonywania, zapewniają grupie uprawnienia tylko do odczytu i wykonywania, a wszystkim innym nie zapewniają dostępu. Ostatni wpis ACL w tym przykładzie przyznaje określonemu użytkownikowi o identyfikatorze obiektu "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" uprawnienia do odczytu i wykonywania.
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);
}
Aktualizacja ACL
Podczas aktualizowania listy ACL należy ją zmodyfikować, a nie zastępować. Można na przykład dodać nowego podmiotu zabezpieczeń do listy ACL bez wpływu na inne podmioty zabezpieczeń wymienione na liście ACL. Aby zastąpić listę ACL zamiast ją zaktualizować, zobacz sekcję Ustawianie list ACL w tym artykule.
W tej sekcji pokazano, jak wykonać następujące działania:
- Zaktualizuj ACL
- Zaktualizuj zasady ACL rekurencyjnie
Zaktualizuj ACL
Najpierw pobierz listę ACL katalogu, wywołując metodę PathAccessControl.getAccessControlList . Skopiuj listę wpisów listy ACL do nowego obiektu Listy typu PathAccessControlListEntry. Następnie znajdź wpis, który chcesz zaktualizować i zastąp go na liście. Ustaw listę ACL, wywołując metodę DataLakeDirectoryClient.setAccessControlList .
W tym przykładzie lista ACL katalogu o nazwie my-parent-directory zostaje zaktualizowana poprzez zastąpienie wpisu dla wszystkich innych użytkowników.
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());
}
Można również pobrać i ustawić listę ACL katalogu głównego kontenera. Aby uzyskać katalog główny, przekaż pusty ciąg ("") do metody DataLakeFileSystemClient.getDirectoryClient .
Zaktualizuj zasady ACL rekurencyjnie
Aby zaktualizować ACL rekursywnie, utwórz nowy obiekt ACL ze wpisem, który chcesz zaktualizować, a następnie użyj tego obiektu w operacji aktualizacji ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy listy ACL do zaktualizowania.
Aktualizuj listy ACL cyklicznie, wywołując metodę DataLakeDirectoryClient.updateAccessControlRecursive . Przekaż tej metodzie Listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis ACL.
Jeśli chcesz zaktualizować domyślny wpis listy ACL, możesz wywołać metodę setDefaultScopeelementu PathAccessControlEntry i przekazać wartość true.
W tym przykładzie zaktualizowano wpis ACL z uprawnieniami do zapisu. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope , który określa, czy zaktualizować domyślną listę ACL. Ten parametr jest używany w wywołaniu metody setDefaultScope metody 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);
}
Usuń wpisy ACL
Można usunąć jeden lub więcej wpisów ACL. W tej sekcji pokazano, jak wykonać następujące działania:
- Usuń wpis ACL
- Usuń wpisy ACL rekursywnie
Usuń wpis ACL
Najpierw pobierz listę ACL katalogu, wywołując metodę PathAccessControl.getAccessControlList . Skopiuj listę wpisów listy ACL do nowego obiektu Listy typu PathAccessControlListEntry. Następnie znajdź wpis, który chcesz usunąć, i wywołaj metodę Remove obiektu List. Ustaw zaktualizowaną listę ACL, wywołując metodę 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());
}
}
Usuń wpisy ACL rekursywnie
Aby usunąć wpisy ACL rekursywnie, utwórz nowy obiekt ACL dla wpisu, który ma zostać usunięty, a następnie użyj tego obiektu w operacji usuwania ACL. Nie pobieraj istniejącej listy ACL, po prostu podaj wpisy, które mają zostać usunięte z listy ACL.
Usuń wpisy ACL, wywołując metodę DataLakeDirectoryClient.removeAccessControlRecursive. Przekaż tej metodzie Listę obiektów PathAccessControlEntry. Każdy element PathAccessControlEntry definiuje wpis ACL.
Jeśli chcesz usunąć domyślny wpis listy ACL, możesz wywołać metodę setDefaultScope dla elementu PathAccessControlEntry i przekazać wartość true.
W tym przykładzie usunięto wpis z listy ACL katalogu o nazwie my-parent-directory. Ta metoda akceptuje parametr logiczny o nazwie isDefaultScope , który określa, czy usunąć wpis z domyślnej listy ACL. Ten parametr jest używany w wywołaniu metody setDefaultScope metody 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);
}
Odzyskiwanie po awariach
Mogą wystąpić błędy środowiska uruchomieniowego lub uprawnień. W przypadku błędów środowiska uruchomieniowego uruchom ponownie proces od początku. Błędy uprawnień mogą wystąpić, jeśli podmiot zabezpieczeń nie ma wystarczających uprawnień do modyfikowania listy kontroli dostępu (ACL) katalogu lub pliku, którego hierarchia jest zmieniana. Rozwiąż problem z uprawnieniami, a następnie wybierz, aby wznowić proces od punktu awarii przy użyciu tokenu kontynuacji lub uruchomić ponownie proces od początku. Jeśli wolisz ponownie uruchomić od początku, nie musisz używać tokenu kontynuacji. Możesz ponownie zastosować wpisy listy kontroli dostępu (ACL) bez negatywnego wpływu.
Ten przykład zwraca token kontynuacji w przypadku awarii. Aplikacja może wywołać tę przykładową metodę ponownie po usunięciu błędu i przekazać token kontynuacji. Jeśli ta przykładowa metoda jest wywoływana po raz pierwszy, aplikacja może przekazać wartość null parametru tokenu kontynuacji.
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;
}
}
Jeśli chcesz, aby proces zakończył się bez zakłóceń wynikających z błędów uprawnień, możesz to zaznaczyć.
Aby upewnić się, że proces zakończy się nieprzerwanie, wywołaj metodę setContinueOnFailure obiektu PathSetAccessControlRecursiveOptions i przekaż wartość true.
W tym przykładzie rekursywnie ustawiane są wpisy listy ACL. Jeśli ten kod napotka błąd uprawnień, rejestruje ten błąd i kontynuuje wykonywanie. W tym przykładzie liczba niepowodzeń jest drukowana na konsolę.
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());
}
Najlepsze rozwiązania
Ta sekcja zawiera wskazówki dotyczące najlepszych praktyk dotyczących rekursywnego ustawiania list kontroli dostępu (ACL).
Obsługa błędów środowiska uruchomieniowego
Błąd środowiska uruchomieniowego może wystąpić z wielu powodów (na przykład: awaria lub problem z łącznością klienta). Jeśli wystąpi błąd środowiska uruchomieniowego, uruchom ponownie rekursywny proces ACL. Zasady ACL można ponownie zastosować do elementów bez negatywnych skutków.
Obsługa błędów uprawnień (403)
Jeśli wystąpi wyjątek kontroli dostępu podczas wykonywania rekursywnego procesu ACL, podmiot zabezpieczeń AD może nie mieć wystarczających uprawnień do zastosowania ACL do co najmniej jednego elementu podrzędnego w hierarchii katalogów. Po wystąpieniu błędu uprawnień proces zostanie zatrzymany i zostanie udostępniony token kontynuacji. Rozwiąż problem z uprawnieniami, a następnie użyj tokenu kontynuacji, aby przetworzyć pozostały zestaw danych. Katalogi i pliki, które zostały już pomyślnie przetworzone, nie będą musiały zostać ponownie przetworzone. Możesz również zdecydować się na ponowne uruchomienie rekursyjnego procesu ACL. Zasady ACL można ponownie zastosować do elementów bez negatywnych skutków.
Akredytacje
Zalecamy aprowizację podmiotu zabezpieczającego w usłudze Microsoft Entra, któremu przypisano rolę Właściciela danych obiektu blob w zakresie docelowego konta magazynu lub kontenera.
Wydajność
Aby zmniejszyć opóźnienie, zalecamy uruchomienie rekursywnego procesu ACL na maszynie wirtualnej (VM) platformy Azure znajdującej się w tym samym regionie co konto magazynu.
Limity listy ACL
Maksymalna liczba list ACL, które można zastosować do katalogu lub pliku, to 32 listy ACL dostępu i 32 domyślne listy ACL. Aby uzyskać więcej informacji, zobacz Kontrola dostępu w usłudze Azure Data Lake Storage Gen2.