コンテキスト: SQL DB に支えられた MVC Web サービス。データベースにユーザー リレーションがあり、一連の FK を介してそれを参照するリレーションのセットがあるとします。たとえば、次のテーブルがあるとします。
sales_people
car_dealership
cars
営業担当者が特定の自動車販売店に所属している場合、自動車もそうです。営業担当者は、特定のディーラーに属する車のみを表示できる必要があります。ここにはいくつかのオプションがあります。
認可ビジネス ロジックを SQL クエリ自体に組み込むことができます。
SELECT *
FROM cars as c, sales_people AS sp, car_dealerships AS cd
WHERE where c.dealership_id = cd.id
AND sp.dealership_id = cd.id
AND sp.id = ?
AND c.id = ?
発信者が sales_people ID が正当であり、その ID の些細ななりすましを防いでいることを確認したと仮定すると、上記のクエリは、ユーザーが自分のものではない車を手に入れるのを防ぎます。結合が大規模すぎない限り、これはおそらく任意の数のテーブルに拡張できます。
アップサイド?1 回の DB 呼び出し。
欠点?
- ここでの承認ビジネス ロジックは非常に基本的なものです。これらのテーブルのいずれかによって参照されているユーザーですか? もちろん、合格できます。しかし、もっと複雑なアクセス ルールが必要だとしましょう。1 つの単純なクエリでは実行できない可能性があります。
- ユーザーが許可されていない行を要求したのか、行が許可されているが実際には存在しないのかを判断するのは難しいため、エラー報告が難しくなります。200 と 403 のどちらを報告する必要があるかはわかりません (ただし、API のタイプによっては、これらの場合に常に 200 を使用して、攻撃者に過度の情報が公開されるのを防ぐことができます)。
私が目にする他のオプションは、データが実際にそのユーザーにアクセス可能であることを検証するために、事実の前または後に追加のクエリを作成することです。たとえば、営業担当者が取得を許可されている車の ID のリストを取得し、そのサブセットに対してクエリを実行するか、またはその逆です。
利点は明らかに、ビジネス レイヤーでより多くの呼び出しを行い、より多くのロジックを実行できることです。
欠点は、より多くの DB トラフィックを生成することです。これは、その要求が行われる頻度によっては契約を破る可能性があります。
ここには他にもいくつかのオプションが欠けている可能性があります。以前に問題をどのように解決したかを知りたいです。より良い方法はありますか?