カウントベースのアクセス制御の設計について、アドバイスが欲しいです。たとえば、顧客がアカウントに基づいてシステムで作成できるユーザーの数を制限したいと考えています。したがって、デフォルトでは顧客は 2 人のユーザーを作成できますが、アカウントをアップグレードすると 5 人のユーザーを作成できるようになります。同様の基準で制限する必要がある機能が他にもいくつかあります。
アプリケーションは一般的なモデルに従っているため、公開されているすべての機能にはバッキング テーブルがあり、そのテーブルで CRUD 操作を処理するクラスがあります。また、アプリケーションは複数のノードで実行され、分散キャッシュがあります。
これを実装するために私が取っているアプローチは次のとおりです。制御する機能と許可された制限 (顧客ごとに保存) をキャプチャする新しいテーブルがあります。- すべてのテーブルの create メソッドをインターセプトし、問題のテーブルにアクセス制御を適用する必要があるかどうかを確認します。その場合、作成されたエンティティの数を取得し、制限と比較して、作成を許可するかどうかを決定します。- 同時リクエストの場合に同期を処理するためにデータベースを使用しています。したがって、create メソッドが呼び出された後、次の where 句を使用してテーブルを更新します
どこで ( count_column + 1 ) = #countInMemory#
. つまり、更新は、DB に保存されている値 + 1 = メモリ内の値の場合にのみ成功します。これにより、2 つのスレッドが同時に作成を試みても、正常に更新できるのはそのうちの 1 つだけになります。正常に更新されたスレッドが勝ち、もう一方のスレッドはロールバックされます。この方法では、アプリケーション内のコードを同期する必要はありません。
これを行う他の/より良い方法があるかどうか知りたいです。私のアプリケーションは、Oracle と MySQL DB で実行されます。
助けてくれてありがとう。