4

MongoDB でアクセス制御をモデリングする例はありますか? 私が考えている状況は次のとおりです。

リソースのセットがあり、それぞれが独自のドキュメント (車、人、木など) です。

ユーザーは、明示的な許可を通じて、または別のコレクション (ロールなど) に存在するリソースの所有者になることによって、または他の暗黙的な方法で暗黙的にリソースにアクセスできます。

1 つの collection.find() メソッドで、(ページネーションのために) スキップ オプションと制限オプションを適用できますが、これらすべての明示的および暗黙的なパスをチェックし、ユーザーがアクセスできるリソースの結果を生成する方法はありますか?

MySQL では、リソース ID、許可ユーザー ID、許可されたユーザー ID、および操作 (読み取り、書き込みなど) を持つ許可テーブルを使用してこれをモデル化しました。次に、1 つのクエリで、少なくとも 1 つのサブクエリが true であるすべてのリソースを選択し、サブクエリはアクセスするためのさまざまなパスをすべてチェックします。たとえば、1 つは許可をチェックし、1 つは所有権をチェックします。

MongoDBでこれを行うことに頭を悩ませることはできません.それが可能かどうかさえわかりません...

ありがとう

4

2 に答える 2

3

一度に複数のドキュメントを照会することはできません。理想的には、アクセス制御はビジネス ロジックの一部であってはなりません。バックエンドの php/c#/language は、現在のリクエストが承認されていることを確認する必要があります。その場合は、要求されたドキュメントをクエリするだけです。

mongodb にまったく同じ構造を実装する必要があると思われる場合は、それらのフィールドをすべて埋め込む必要があります (リクエストが承認されているかどうかを識別するのに役立つ他の mysql テーブルのフィールド)。すべてのコレクションのすべてのドキュメントで。データを複製します (非正規化)。これは、すべてのコピーが更新され、同じ値を持つようにするという頭痛の種です。

編集1:

カードキュメントについて話しましょう。その所有者を追跡するために、ownerプロパティが必要です (これに_idは所有者ドキュメントの が含まれます)。車を「使用」(明示的な許可) できるすべてのユーザーを追跡するには、配列を作成allowerdDriversします (これに_idは各userドキュメントの が含まれます)。リクエストを行っている現在のユーザーが「管理者」ロールに属していると仮定しましょう。ドキュメントには、該当する各ロール ドキュメントのを格納userする配列があります。applicableRoles_id

ユーザーがアクセスできるすべての車を取得するには、2 つのクエリを実行するだけで済みます。彼の役割を取得する 1 つ。彼が管理者の場合は、すべての車を返却してください。ownerそうでない場合は、彼の ID に彼の IDが含まれる別のクエリを作成しますor allowedDrivers

実際のユースケースはもっと複雑かもしれませんが、それを解決するドキュメント指向の方法がある可能性があります。ドキュメントでデータをモデル化する方法は、RDbMS でモデル化する方法とは大きく異なることを認識する必要があります。

于 2012-11-25T08:25:42.720 に答える
0

ビジネスロジックでそれを行うと、非常に遅くなり、非効率的になります。

どうして?これはビジネス ロジックです。ユーザー a が投稿 b を所有している場合は、ユーザーにアクションを実行させ (MVC スタイル)、そうでない場合は実行させません。

私にはビジネス ロジックのように聞こえますが、ほとんどのフレームワークでは、このビジネス ロジックは (MVC パラダイムの) コントローラー アクション内に配置されると見なされています。つまり、PHP Yii では:

Yii::app()->roles->hasAccess('some_view_action_for_a_post', $post)

データベース側でそれを行うことで、ストレージ層とビジネス層を混同していると思います。

また、いくつかの役割ベースのアクセス許可アクションがコミットするクエリを取得できる複雑さは、多くのサブ選択でかなり大きくなければなりません。MySQL が結果セットを作成および処理する方法 (サブ選択は結合ではありません) を考慮すると、これらのクエリは特にうまくスケーリングされていないと感じています。

また、ロールを変更する場合、または特定のオブジェクトにアクセスできるロールを定義する関数を変更する場合を考慮する必要があります。単にロールをロール テーブルに追加してオブジェクトを割り当てるのではなく、SQL クエリを直接変更する必要があります。そのロールのプロパティとそのロールをユーザーに割り当てる (AKA コードの変更)。

したがって、他の言語 (および独自のフレームワーク) の他のフレームワークが RBAC をどのように行っているかを真剣に調べます。なぜなら、あなたは境界線を曖昧にし、あなたが行ったことであなたの人生を非常に困難にしていると思うからです。実際、ここから始めるのが良い場所かもしれません。 : node.js と express.js でのグループ/ルール ベースの承認アプローチ

于 2012-11-25T16:23:25.353 に答える