如何实现SASTokenProvider以支持容器级SAS令牌访问ADLS Gen2
基于Databricks机密作用域实现ADLS Gen2容器粒度SASTokenProvider方案
实现逻辑
- 提前在Databricks机密作用域中为每个需要授权的容器存入对应权限的SAS令牌,建议采用
{存储账户名称}-{容器名称}-sas的格式作为机密名称,避免不同存储/容器的命名冲突 - 直接调用Databricks内置的
dbutils.secrets.get接口,在getSASToken方法中根据传入的存储账户名、容器名动态拉取对应SAS令牌 - 若容器未配置对应机密,直接返回空字符串即可触发ABFS驱动的访问拒绝逻辑,实现权限隔离
修改后完整代码
%scala package com.foo // package cell中需通过该方式引入dbutils,不能直接调用顶层dbutils import com.databricks.dbutils_v1.DBUtilsHolder.dbutils class CustomTokenProvider extends org.apache.hadoop.fs.azurebfs.extensions.SASTokenProvider { // 替换为实际使用的机密作用域名称 private val SECRET_SCOPE = "自定义机密作用域名" def getSASToken(accountName: String, fileSystem: String, path: String, operation: String): String = { // 按照提前约定的机密命名规则拼接目标机密名 val secretName = s"${accountName}-${fileSystem}-sas" try { dbutils.secrets.get(SECRET_SCOPE, secretName) } catch { // 无对应机密权限/机密不存在时返回空,触发ABFS访问拒绝逻辑 case _: Exception => "" } } def initialize(configuration: org.apache.hadoop.conf.Configuration, accountName: String): Unit = { // 无额外初始化需求可留空 } }
原有配置无需修改,仍按如下方式开启自定义令牌提供逻辑
// 替换STORAGE_ACC为实际存储账户名 spark.conf.set("fs.azure.account.auth.type.STORAGE_ACC.dfs.core.windows.net", "SAS") spark.conf.set("fs.azure.sas.token.provider.type.STORAGE_ACC.dfs.core.windows.net", "com.foo.CustomTokenProvider")
注意事项
- 机密作用域需提前配置用户/组级访问权限,确保不同身份的用户仅能拉取到自己被授权的容器SAS令牌,从根源实现权限隔离
- 该方案仅针对abfss驱动生效,无需依赖Databricks Unity Catalog身份体系,直接对底层存储访问做管控
- 禁止将SAS令牌配置到集群级环境变量,避免集群内所有用户共享相同权限
- 建议给SAS令牌配置合理的过期时间,到期后直接更新机密作用域中对应机密的值即可,无需修改代码或集群配置
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

