Morphで構築するデータアプリでは、アクセスするユーザーの情報を活用してロールベースのアクセス制御を行うことができます。 Morphのフレームワーク上のPython関数では、context: MorphGlobalContextという引数を受け取ることができます。 このcontextuser_infoという変数にユーザー情報が格納されています。

context.user_infoの変数の型は以下の通りです。

変数説明
user_idユーザーIDstr
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)