1

私は Web ベースのアプリケーションを使用しており、各ユーザーには、州、都市、支店、または郵便番号で構成される「ジオアクセス」と呼ばれる特権が付与されます。

  1. 州。 現在、合計 15 の州があります。

  2. 街。 各州には約 200 以上の都市があります。200 都市 x 15 州 = 合計 3000 都市

  3. 支店また​​は郵便番号。
    各都市に支店がある = 10. 3000 都市 x 10 支店 = 合計 30,000 支店。
    郵便番号を持つ各都市 = 20。3000 都市 x 25 郵便番号 = 合計 75000 郵便番号。

ルール:
1. 各ユーザーは、少なくとも 1 つの支店または郵便番号 (いずれかのみ) にアクセスできる必要があります。
2. ユーザーはすべての状態にアクセスできます。この場合、ユーザーがすべての支店または郵便番号にアクセスできることも意味します。

質問:
論理的に少し考えて、「支店」または「郵便番号」を特権の最後のレベルと見なして、ソリューションの構築を開始できます。しかし、ユーザーごとに生成されるデータの量を見ると、ここで深い混乱に陥ります。

たとえば、ユーザーがすべての州の権限を持っている場合、このユーザーには 75,000 の郵便番号または 30,000 の支店を設定する必要があります。

ユーザーが「すべて」の州や都市などを必要とする場合に備えて、誰かが「-1」または一意の固定値を使用するように提案しました。道。

このような状況を経験したことがある人もいると思います。お知らせ下さい。ありがとう。

4

2 に答える 2

0

レコード レベルのセキュリティを適用しているようです。

最善の方法は、セキュリティ テーブルを 1 つ持つことです (各テーブルStatesCityBranch or Post Codeおよびキャッチオール アクセス許可Allには独自の ID があります。これはできるだけ小さい数値データ型にする必要がありますが、ここではわかりやすくするためにテキストとして扱います。答え):

UserID    TableID    RecordID

RecordIDnull 可能です。

単一のレコード:UserID = @x TableID = 'All' RecordID = Nullが入力された場合、そのユーザーはすべてのデータにアクセスできます。

ユーザーが州の data: へのアクセスを許可されている場合UserID = @x TableID = 'States' RecordID = 1、そのユーザーは ID = 1 の州に関連するすべての都市と郵便番号にアクセスできます。

ユーザーが都市の data: へのアクセスを許可されている場合UserID = @x TableID = 'City' RecordID = 1、そのユーザーは ID = 1 の都市に関連するすべての郵便番号にアクセスできます。

支店また​​は郵便番号のデータへのアクセス権がユーザーに付与されている場合、UserID = @x TableID = 'Branch or Post Code' RecordID = 1そのユーザーは ID = 1 の支店または郵便番号のみにアクセスできます。

必要に応じて、追加のビット フィールドを追加できます:Denyが 1 に等しい場合、そのレコードへのアクセスを拒否します。これは、次のようなシナリオで役立ちます。市 "X" では、ユーザーはいくつかの郵便番号を除くすべてにアクセスできるため、市へのアクセスを許可し、除外された郵便番号へのアクセスを拒否します。

もちろん、許可記録がなければアクセスはありません。

もう少し単純なものが必要な場合は、地理テーブルごとに 1 つの権限テーブルを作成し、ユーザー レコードに「すべてのアクセス」ビット フィールドを作成できます。

アクセス許可テーブルのデータに従って地理テーブルをフィルター処理する SQL を生成する必要があります。

編集:

データ サイズ、プログラミングの単純さ、およびデータの維持のしやすさに関する質問者の懸念を考えると、次のようになります。

  1. このアプローチは、データのオーバーヘッドを最小限に抑えるように設計されています。ユーザーがデータ セット全体またはデータ ツリーのサブツリー全体へのアクセスを許可 (または拒否) されている場合、必要なアクセス許可レコードは 1 つだけです。ユーザーごとの権限レコードの数が非常に多くなる可能性があるのは、ユーザーがブランチへのアクセスを少しずつ許可されている場合のみです。

  2. 3 つのテーブルからの関連データをアクセス許可 UI に集約し、データにアクセス許可を適用するためのコーディング作業が少しありますが、これは、合理的に有能なプログラマーが作成または理解する能力を超えてはなりません。適切にコメントされ、文書化されています。アプリケーションを担当するプログラマーが十分な能力を持っていないと予想される場合は、パーミッションをテーブルごとに個別のパーミッション セットに分割できますが、これは DBA にとってあまり役に立たない可能性があります。

  3. このアプローチは各ユーザーに関連付けられる権限レコードの数を最小限に抑える必要があるため、DBA が必要とする数千の権限レコードを生成する、純粋に最下位レベルの許可のみの権限構造よりも維持するのがはるかに簡単です。これは、包含と省略のエラーがはるかに発生しやすいアプローチでもあります。私が説明したアプローチでは、ユーザーごとに数千ではなく、ほんの一握りの許可レコードしか必要としない場合があります。

于 2013-10-09T22:53:31.180 に答える