使用Python SDK遍历Azure Data Lake Gen1文件夹时遇权限拒绝问题
问题:Azure Data Lake Gen1 服务主体已分配Owner角色,仍无法访问部分文件夹
我正尝试使用Python SDK遍历Azure Data Lake Gen1中的所有文件夹,已为所用服务主体分配Owner角色,但访问部分文件夹时仍出现权限拒绝错误,不确定是否还需要其他角色,因为我认为Owner已是最高权限角色。
使用的代码如下:
%pip install azure-mgmt-resource %pip install azure-mgmt-datalake-store %pip install azure-datalake-store import re import datetime; from azure.datalake.store import lib, core from azure.common.credentials import ServicePrincipalCredentials from pyspark.sql.types import StringType from pyspark.sql.functions import udf,split, explode,col,when,concat,array_contains,lit import datetime; def authenticate(clientId, secretId, tenantId): RESOURCE = 'https://datalake.azure.net/' tenant = tenantId client_id = clientId client_secret = secretId adlCreds = lib.auth(tenant_id=tenant, client_secret=client_secret, client_id=client_id, resource=RESOURCE) adl = core.AzureDLFileSystem(adlCreds, store_name="xxx") return adl clientId = dbutils.secrets.get(scope = "datalakesecurity", key = "datalakeclientid") secretId = dbutils.secrets.get(scope = "datalakesecurity", key = "datalakecredential") tenantId = 'xxxxx' adl = authenticate(clientId, secretId, tenantId) path_to_look= '/' level1 = adl.ls(path_to_look) print(level1)
解决方案
核心原因:RBAC角色≠ADLS Gen1的ACL权限
Azure Data Lake Gen1的权限体系分为两层:
- RBAC角色(如Owner):仅针对Data Lake Store账户级别的管理权限,用于资源的创建、删除、配置修改等操作,不直接控制文件/文件夹的访问。
- ACL权限:这是ADLS Gen1中控制数据访问的核心,针对单个文件或文件夹设置,决定主体能否遍历目录、读取内容、写入数据等。即使拥有RBAC的Owner角色,若目标文件夹的ACL未给服务主体授权,依然会触发权限拒绝。
具体排查与解决步骤
检查目标文件夹的ACL配置
进入Azure门户的ADLS Gen1账户,打开「数据资源管理器」,找到报错的文件夹,右键选择「权限」,确认服务主体是否拥有:- 执行(Execute):允许遍历父目录,访问子资源
- 读取(Read):允许列出目录内容
若未配置,添加对应权限即可。
确认ACL继承设置
如果父目录的ACL未开启继承,子目录不会自动继承上层权限。可在文件夹权限设置中,勾选「继承父权限」,或手动批量设置子目录权限。验证服务主体身份一致性
确认代码中使用的clientId与Azure门户中分配权限的服务主体ID完全一致,避免因主体错误导致权限不匹配。代码优化:添加异常处理跳过无权限目录
遍历目录时遇到无权限的文件夹会直接报错中断,可添加异常捕获逻辑,跳过此类目录:
def list_all_folders(adl, path): try: items = adl.ls(path) for item in items: print(item) # 递归遍历子目录 if adl.isdir(item): list_all_folders(adl, item) except Exception as e: print(f"无法访问路径 {path},权限不足:{str(e)}") # 调用遍历函数 list_all_folders(adl, '/')
内容的提问来源于stack exchange,提问作者Ash3060
相关产品推荐
相关产品推荐

