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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:27:02