You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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未给服务主体授权,依然会触发权限拒绝。

具体排查与解决步骤

  1. 检查目标文件夹的ACL配置
    进入Azure门户的ADLS Gen1账户,打开「数据资源管理器」,找到报错的文件夹,右键选择「权限」,确认服务主体是否拥有:

    • 执行(Execute):允许遍历父目录,访问子资源
    • 读取(Read):允许列出目录内容
      若未配置,添加对应权限即可。
  2. 确认ACL继承设置
    如果父目录的ACL未开启继承,子目录不会自动继承上层权限。可在文件夹权限设置中,勾选「继承父权限」,或手动批量设置子目录权限。

  3. 验证服务主体身份一致性
    确认代码中使用的clientId与Azure门户中分配权限的服务主体ID完全一致,避免因主体错误导致权限不匹配。

  4. 代码优化:添加异常处理跳过无权限目录
    遍历目录时遇到无权限的文件夹会直接报错中断,可添加异常捕获逻辑,跳过此类目录:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:27:34