0

カウントベースのアクセス制御の設計について、アドバイスが欲しいです。たとえば、顧客がアカウントに基づいてシステムで作成できるユーザーの数を制限したいと考えています。したがって、デフォルトでは顧客は 2 人のユーザーを作成できますが、アカウントをアップグレードすると 5 人のユーザーを作成できるようになります。同様の基準で制限する必要がある機能が他にもいくつかあります。

アプリケーションは一般的なモデルに従っているため、公開されているすべての機能にはバッキング テーブルがあり、そのテーブルで CRUD 操作を処理するクラスがあります。また、アプリケーションは複数のノードで実行され、分散キャッシュがあります。

これを実装するために私が取っているアプローチは次のとおりです。制御する機能と許可された制限 (顧客ごとに保存) をキャプチャする新しいテーブルがあります。- すべてのテーブルの create メソッドをインターセプトし、問題のテーブルにアクセス制御を適用する必要があるかどうかを確認します。その場合、作成されたエンティティの数を取得し、制限と比較して、作成を許可するかどうかを決定します。- 同時リクエストの場合に同期を処理するためにデータベースを使用しています。したがって、create メソッドが呼び出された後、次の where 句を使用してテーブルを更新します

どこで ( count_column + 1 ) = #countInMemory#

. つまり、更新は、DB に保存されている値 + 1 = メモリ内の値の場合にのみ成功します。これにより、2 つのスレッドが同時に作成を試みても、正常に更新できるのはそのうちの 1 つだけになります。正常に更新されたスレッドが勝ち、もう一方のスレッドはロールバックされます。この方法では、アプリケーション内のコードを同期する必要はありません。

これを行う他の/より良い方法があるかどうか知りたいです。私のアプリケーションは、Oracle と MySQL DB で実行されます。

助けてくれてありがとう。

4

1 に答える 1

0

ロールバックするとき、(新しいユーザー数を取得した後に) 再試行しますか? それとも失敗しますか? 新しくフェッチされたユーザー数が別のユーザーを許可すると仮定して、前者をお勧めします。

私は最近同様のシステムを扱いましたが、考慮すべき点がいくつかあります。CustomerA がユーザーを CustomerB に転送できるようにしますか? (これは、顧客が独立していないことを前提としています。たとえば、私たちのシステムでは、CustomerA が IT マネージャーであり、CustomerB が同じ会社で働く経理マネージャーである可能性があります。CustomerA の従業員の 1 人が経理部門に異動したとき、彼はこれを CustomerB の従業員に反映させたいと考えています。顧客が削除されると、顧客のユーザーはどうなりますか? (私たちの場合、別の顧客/マネージャーがそれらを採用する必要があります。そうしないと、それらは削除されます。)顧客のユーザー制限を別のテーブルにどのように保存していますか(たとえば、顧客のタイプは「レベル2」で、顧客タイプは表では、「レベル 2」のお客様は 5 人のユーザーを作成できると記載されています)、またはお客様のtype5 人のユーザーを持つことができるというoverride列と、さらに 3 人のユーザーを持つことができるという列)?

しかし、それは論外です。DB 同期は問題ありません。

于 2013-04-17T16:04:34.550 に答える