Morphで構築するデータアプリでは、アクセスするユーザーの情報を活用してロールベースのアクセス制御を行うことができます。
Morphのフレームワーク上のPython関数では、context: MorphGlobalContextという引数を受け取ることができます。
このcontextのuser_infoという変数にユーザー情報が格納されています。
context.user_infoの変数の型は以下の通りです。
| 変数 | 説明 | 型 |
|---|
user_id | ユーザーID | str |
email | ユーザーのメールアドレス | str |
username | ユーザー名 | str |
first_name | ユーザーの名前 | str |
last_name | ユーザーの苗字 | str |
roles | ユーザーのプロジェクトロール | list[str] |
プロジェクトロールの設定方法
MorphGlobalContextに格納されるユーザー情報のrolesという変数には、ユーザーのプロジェクトロールが格納されています。
プロジェクトロールは、プロジェクトごとにユーザーに設定できるロールです。プロジェクト詳細の”Member Access”タブで設定できます。
開発環境でのユーザー情報の使用方法
開発環境ではダッシュボードの認証情報を渡していないので、context.user_infoには、以下の固定の値が格納されます。
{
"user_id": "cea122ea-b240-49d7-ae7f-8b1e3d40dd8f",
"email": "mock_user@morph-data.io",
"username": "mock_user",
"first_name": "Mock",
"last_name": "User",
"roles": ["Admin"],
}
カスタマイズしたユーザー情報を使用する
/path/to/project/.mock_user_context.jsonを作成して、上記のJSONと同じ型で値を保存すると、自動的にcontext.user_infoの値が切り替わります。
rolesの設定値を変更してロールベースのアクセス制御の実装を行うことができます。
認証用のJSONデータを署名なしのJWTトークンとして、authorizationヘッダーに渡すことでも同様にユーザー情報を切り替えることができます。
サンプルコード
以下のサンプルコードは、ユーザーがAdminロールを持っている場合のみにPygwalkerを使用したダッシュボードを表示するコードです。
import pandas as pd
import morph
from morph import MorphGlobalContext
from morph_lib.types import HtmlResponse
import pygwalker as pyg
@morph.func
@morph.load_data("example_data")
def create_pygwalker_dashboard(context: MorphGlobalContext):
data = context.data["example_data"]
if "Admin" not in context.user_info["roles"]:
return HtmlResponse("You are not authorized to access this dashboard.")
return pyg.to_html(data)