ユーザーがアクセスできるすべてのリソースのリストを取得する推奨される方法は何ですか?認可サービス - 許可されたリソースのリストを返す
私が見てきた多くの例では、認可は別々のサービスに置かれています - 個々のクエリで使用できるisAuthorized()に似たメソッドを公開するものがよくあります(「ユーザーはリソースABC ? ")とバルククエリー("ユーザーは以下のリソースリストのいずれかを使用する権限を持っていますか? ")。
承認ロジックは、認可ポリシーの執行が結果に基づいて、実際にリソースへのアクセスを実現するために(例えば、ビジネス・ロジック層、アプリケーション自体内に保持され、承認サービスに存在するが認可サービスからの結果に基づいて個々のオプションを表示/非表示するためのプレゼンテーションレイヤーなど)を作成することができます。
たとえば、データアクセス層に何十億という「リソース」が返ってくる可能性がある場合は、これを行うのが好ましい方法は何ですか?私のビジネスロジック層は、すべてのデータを(ネットワークを介してすべてのデータを渡して)照会し、その巨大なリストを認可サービス(ネットワークを介して)に転送し、「許可/拒否」の巨大なリストを取得し、ビジネスロジックに送り返されますか?明らかに、それはかなり正しいとは言えません。
データアクセス、認可ロジック、およびビジネスロジックを「きれいに」分離することはできませんか?代わりに私のデータアクセス層に、ユーザーがアクセスできるすべてのリソースのリストを返すように要求する必要があります。これは単純なデータベース結合として実装される可能性がありますが、 (つまり、認可ポリシー)がデータアクセスコードに埋め込まれているため、それらのポリシーは自分のコードベースに広がります(たとえば、認可ロジックがデータアクセスレイヤー、いくつかは私の認証レイヤーなどにあるでしょうか?)
パフォーマンスは「クリーン」アーキテクチャよりも優先されるかもしれませんが、これを行うにはより良い方法がありますか?
私は、私が取り組んでいる大きなレガシーアプリケーションで同様の難問に直面しています。 「大規模な結果セット」シナリオは難しいですが、私は間違いなくsJhonnyが暗示するような問題ではないとは思いません。 **すべての**レコードの結果セットは良いデザインではないかもしれませんが、レコード数やページ数を提供したい場合は問題はあります。これは、データレイヤーが異なるテクノロジ、たとえばSQLストアドプロシージャで構築されている場合、さらに困難になります。認可ロジックを複製することに認めても、別の言語で書かれています。 – Snixtor