チャンネルのための権限
権限
ユーザーがアクセス可能なチャンネルデータを確認する必要があります。基準はシンプルです。
- チャンネルのメンバーなら誰でも、そのチャンネルに関するデータを読み取れる必要があります。
これは、チャンネルテーブルでレコードにアクセスしようとしている人はチャンネル channel_members.user_id = X-Hasura-User-Id
のメンバーである必要があることを示す典型的なブール式です
行レベル選択
上記のステートメントの拡張された有効なブール式は、以下のようになります。
{"channel_members": {"user_id": {"_eq": "X-Hasura-User-Id"}}}
列レベル選択
ユーザーがアクセスすると想定される行を除外した後、読み取りが許可されるフィールドを除外する必要があります。特定のタイプのユーザーのみに制限する必要がある機密データはないため、すべての列に選択する権限を与えます。
読み取りアクセスが完了しました。次に、ユーザーがチャンネルを作成、更新、または削除できる書き込みアクセスを紹介します。
権限を挿入する
アプリのユーザーは、channel
テーブルに直接挿入できますか?はい。所有者または管理者である認証されたユーザーは、自分でチャンネルを作成できます。ただし、自分が参加しているワークスペースでのみチャンネルを作成できます。以下の式に変換します。
{"_and": [{"workspace": {"workspace_members": {"user_id": {"_eq": "X-Hasura-User-Id"}}}},{"workspace": {"workspace_members": {"user_type": {"type": {"_in": ["owner","admin"]}}}}}]}
_and
ブール式を使用して、両方の条件を満たす必要があることを示します。user_typeテーブルは、値 owner
、admin
、および member
を持つ列挙です。ワークスペースの所有者と管理者の両方は、チャンネルを作成できるため、上記の式も作成できます。
列プリセット
チャンネルテーブルでは、created_by
は自動的にセッション変数 X-Hasura-User-Id
に設定されるべきで、ユーザーにこの値の設定を許可してはなりません。この場合、列プリセットを使用します。
権限
channel
テーブル内の既存のデータを更新できるのは誰ですか?
アプリの認証されたユーザーとワークスペースの所有者または管理者にのみ、ワークスペース内のデータの更新を許可する必要があります。
行レベル更新
上記の条件は、以下の式(上記と同じ)に変換します。
{"_and": [{"workspace": {"workspace_members": {"user_id": {"_eq": "X-Hasura-User-Id"}}}},{"workspace": {"workspace_members": {"user_type": {"type": {"_in": ["owner","admin"]}}}}}]}
列レベル更新
ユーザーがアプリから直接更新できる列を修正する必要があります。チャンネルの公開ステータスと名前(is_public
と name
)のみ変更できるようにします。
権限を削除する
ワークスペースの所有者と管理者を、そのチャンネルを削除できる唯一のユーザーとします。再度、上記のブール式(挿入および更新と同じ)に変換します。
チャンネルが削除された場合、他のすべてのテーブル内のすべての依存レコードも削除する必要があります。そのため、これは、クライアントからのチャンネルの直接削除を許可するのでなく、サーバー側の管理者ロールによる単一の操作として実行できます。もう1つのオプションは、ON DELETEトリガーを使用して、データベース全体のすべての依存行を削除するカスケード削除を実行することです。
- Build apps and APIs 10x faster
- Built-in authorization and caching
- 8x more performant than hand-rolled APIs