Databricks Apps でユーザー単位のアクセス制御を実現
Databricks Appsでユーザー単位のアクセス制御を実装。トークン取得からSDK実行まで解説。
はじめに
Databricks Apps を使ったアプリケーション開発において、ユーザーごとに異なるデータアクセス権限を適用したいケースは多いでしょう。本記事では、Databricks Apps でユーザートークンを取得し、Unity Catalog や Genie Space へのアクセス制御を一気通貫で実装する方法を解説します。
事前設定
1. アプリでのユーザー権限設定
まず、Databricks Apps でユーザー認証を有効化します。
Compute > Apps > 対象のアプリ > Edit > Configure resources から User authorizationからAdd scopeより以下のように設定します。

重要: User authorization が Preview モードになっていることを確認してください。有効になっていない場合は、ユーザー設定から Previews をクリックしてトグルを ON にします。

2. Genie Space への権限付与
接続する Genie Space に対して、ユーザーが Run 以上の権限 を持っていることを確認します。Genie Space の Share ボタンから権限設定を確認できます。

アプリと Genie Space を接続するため、
に Genie Space ID を定義しておきます。
command: ['streamlit', 'run', 'app.py']
env:
- name: 'GENIE_SPACE_ID'
valueFrom: 'genie_space_id'
- name: 'GENIE_DYNAMIC_META'
valueFrom: 'genie_dynamic_meta'
- name: 'OPENAI_API_KEY'
valueFrom: 'openai-api-key'
- name: 'GEMINI_API_KEY'
valueFrom: 'gemini-api-key'
- name: 'DATABRICKS_WAREHOUSE_ID'
valueFrom: 'sql-warehouse'
- name: 'STREAMLIT_GATHER_USAGE_STATS'
value: 'false'3. Unity Catalog への権限付与
ユーザーが参照したいカタログ、スキーマ、テーブルに対して適切な権限(USE CATALOG、USE SCHEMA、SELECT など)が付与されていることを確認します。
実装の流れ
ステップ1: ユーザートークンの取得
Streamlit のコンテキストから、ユーザーがアクセスした際、リクエストヘッダー(x-forwarded-access-token)からトークンを取得します。
user_token = None
if hasattr(st, "context") and st.context.headers is not None:
user_token = st.context.headers.get("x-forwarded-access-token") ステップ2: パイプライン初期状態への保存
取得したトークンを、エージェントの状態管理(state)に保存します。これにより、すべてのサブエージェントが同じトークンにアクセスできるようになります。
state = {
"user_input": user_input,
"chat_history": chat_history,
"user_access_token": user_token, # <--- Stateに保存 }ステップ3: エージェントでのトークン利用
エージェントで state からトークンを取り出し、Databricks SDK のクライアント(WorkspaceClient)を作成します。
# state からトークンを取得
user_token = ctx.session.state.get("user_access_token")
# トークンを使って WorkspaceClient を作成
if user_token:
w = WorkspaceClient( token=user_token, auth_type="pat" )
else: w = WorkspaceClient()作成したクライアントとDatabricks SDKの
APIを使用してSQLクエリ(
)を実行し、データを取得します。
stmt = w.statement_execution.execute_statement(
statement=query,
warehouse_id=warehouse_id,
catalog="data"
)まとめ
Databricks Apps でユーザー単位のアクセス制御を実装するポイントは以下の通りです。
- 事前設定: User authorization、Genie Space、Unity Catalog の権限設定を正しく行う
- トークン取得:
st.context.headersからx-forwarded-access-tokenを取得 - State 管理: 取得したトークンをState に保存し、各エージェントで参照
- SDK 利用:
WorkspaceClient作成時にtokenとauth_type="pat"を指定
この実装により、アプリケーション全体でユーザーの権限に基づいたデータアクセス制御が実現できます。セキュリティとガバナンスを保ちながら、柔軟なデータ活用が可能になります。
