0

私は現在、多くのユーザーが異なるアクセス権を持つリソース用のロールベースの認証システムを設計しています。

役割は、単一のユーザーまたは役割のグループです (つまり、役割は役割のツリーです)。(下の図を参照)

その他の画像はこちら

リソースは複数の認証プロパティ (読み取り、書き込み、削除など) を持つことができます。各認証プロパティは、操作へのアクセスを許可されたロールのリストです。(下の図を参照)

画像はこちら

問題は、ユーザーがプロパティにアクセスする権利を持っているかどうかを確認したい場合、最悪の場合、n 個のツリーをトラバースする必要があることです (n はプロパティに割り当てられたロールの数です)。

たとえば、'Max' がプロパティを読み取ることができるかどうかを確認するには、'Max' が含まれているかどうか、マーケティング、管理、および管理ツリーを確認する必要があります。


役割システムまたは同等に強力なものを維持しながら、非常に高価なツリー検索を削除するアルゴリズムまたは代替アプローチを知っていますか?

完璧なケースは、n ロールの O(log(n)) のようなルックアップです。

ありがとう、フィン

4

3 に答える 3

2

これを測定し、このトラバーサルがパフォーマンスのボトルネックであると判断しましたか?

この種の構造をたどるコストが問題になるほど多くの役割/レベルを持つシステムを見たことがありません。また、ツリーが実際にそれほど大きい場合は、管理者が誰が何を行う権限を持っているかを理解するのが難しくなることが懸念されます。

スケーラビリティに関しては、通常、ASP.NET キャッシュを使用して、適切なキャッシュ タイムアウトで、リソースとロールの間をマップする完全なツリーをキャッシュします。また、ユーザーからロールへのマッピングを個別にキャッシュします (たとえば、セッション内または ASP.NET キャッシュ内のユーザー固有のキーを使用)。

キャッシュからの情報へのアクセスは、通常、毎回データベースにアクセスする場合と比較して、非常に高速です。

于 2009-05-25T20:24:20.083 に答える
0

ロールを SQL データベースに配置すると、説明どおりにルックアップが実質的に実行されます。興味があれば、データベース構造についてお手伝いできます。

于 2009-05-25T20:10:04.043 に答える
0

ポインターを逆にする必要があります。

「Harry」は、「Site2」への「管理者」アクセス権を持つ「Site2 Admins」のメンバーであるため、そのコンテンツを「削除」、「書き込み」、「読み取る」ことができます。

「管理」が「ハリー」と「ジョー」の間で共通のものであるべき理由はよくわかりません。Harry はあるサイトでは管理者ですが、別のサイトでは単なるユーザーであり、Joe はその逆です。

于 2009-05-25T20:13:03.193 に答える