コンテンツにスキップ

データとサインイン中のユーザーの読み取り

サーバーPanelアプリはPlaidCloudのデータを読み取れます。その際、アプリを閲覧しているユーザーとして読み取ります。誰かがアプリを開くと、PlaidCloudはプラットフォームの他の部分と同じシングルサインオンでそのユーザーをサインインさせ、アプリが行うすべての呼び出しはその閲覧者自身の権限で実行されます。共有のサービスアカウントはなく、閲覧者自身が見られないデータをアプリが見ることはありません。

これはサーバーアプリにのみ適用されます。WASMアプリはブラウザー内だけで動作し、サーバー側の接続を持ちません。

読み取りたいデータを持つプロジェクトを指定して、PlaidConnectionを使います。

from plaidcloud.utilities.connect import PlaidConnection
conn = PlaidConnection(project_id="<your-project-id>")

必要な設定はこれだけです。トークン、ユーザー名、パスワードを指定する必要はありません。接続は、サインイン中の閲覧者として自動的に認証されます。プロジェクトのIDは、プロジェクトのURLまたは設定ページで確認できます。

プロジェクトを指定してください。 プロジェクトピッカーでプロジェクトを指定して公開したアプリは、デフォルトでそのプロジェクトを読み取り、Data APIはtable("name")にそのプロジェクトを使います。プロジェクトのないアプリでは、上記のようにPlaidConnectionにproject_idを渡します。引数なしのPlaidConnection()には、読み取るプロジェクトがありません。

接続を使って、名前でテーブルをpandas DataFrameに読み込みます。

df = conn.get_dataframe("Sales Ledger")

接続は閲覧者として動作するため、閲覧者が見ることを許可されている行だけが返されます。閲覧者がプロジェクトにまったくアクセスできない場合は、権限エラーが発生します。

テーブルはSQLを書かず、名前で読み取ってください。 管理者が行アクセスを有効にしているプロジェクトでは、名前で読み取ると各閲覧者の行の許可が適用されます。一方、アプリ自身が組み立てたクエリは、プロジェクトのアーキテクトでないユーザーには拒否されます。許可によるフィルタリングの対象となる単一のテーブルがないためです。名前で読み取れば、どちらの場合でもアプリは動作し続けます。

誰が見ているかに合わせてアプリの表示を調整する場合(パーソナライズされたあいさつ、タブの非表示、行レベルセキュリティなど)は、Panelからサインイン中のユーザーを取得します。

import panel as pn
viewer = pn.state.user # the viewer's email address
token = pn.state.access_token # their JWT, if you need claims or group membership

pn.state.userは、検証済みのサインインから取得した閲覧者のメールアドレスで、そのユーザーのIDとして信頼できます。pn.state.access_tokenは閲覧者の生のアクセストークンで、より細かいルールのためにグループやロールのクレームをデコードする必要がある場合に役立ちます。

この2つを組み合わせます。閲覧者を取得し、すべてのクエリをその閲覧者で絞り込みます。たとえば、各地域のマネージャーに自分の地域だけを表示するには次のようにします。

import panel as pn
from plaidcloud.utilities.connect import PlaidConnection
pn.extension()
viewer = pn.state.user
conn = PlaidConnection(project_id="<your-project-id>")
sales = conn.get_dataframe("Regional Sales")
mine = sales[sales["manager_email"] == viewer]
pn.Column(
f"# Sales for {viewer}",
pn.pane.DataFrame(mine, index=False),
).servable()

接続はすでに閲覧者のプロジェクト権限を適用しているため、このフィルタリングは、閲覧が許可されている範囲に対する追加の絞り込みです。PlaidCloud自身のアクセス制御の代わりにはなりません。

データの呼び出しはアプリのメインフローから行ってください。 サインイン中の閲覧者は、そのセッションに対してアプリのコードが実行されている間(.servable()の処理が行われる場所)に利用できます。ブロッキング呼び出しをバックグラウンドスレッドに移す場合は、asyncio.to_threadを使ってください。素のスレッドプールではセッションのIDが引き継がれず、接続は誤ったデータを読み取るのではなく、明確にエラーとなります。

パブリックアクセスを許可を有効にして公開した場合、アプリはサインインなしで配信されるため、代理となる閲覧者がいません。pn.state.userは空で、PlaidConnection()には認証する対象がありません。公開アプリは誰にとっても安全なデータだけに限定するか、パブリックアクセスをオフにして閲覧者がサインインするようにし、上記のユーザーごとのモデルを適用してください。