質問
私のチームでは、エンティティ データの更新とそれに最適なアプローチ方法について議論しています。これはセキュリティ フレームワークであるため、いくつかの制約とアイデアを次に示します。
- DB 内のすべてのテーブルには GUID である PK があり、これはマルチノード クラスタリング ソリューションに必要です。アイデアとしては、エンティティのこれを API 経由で顧客に公開したくないということです。これは、次の 2 つのことを行う可能性があるためです。
- 彼らに仕事に必要な詳細情報を提供し、ハッカーにシステムに関する詳細情報を提供します。
- サポートの悪夢は、クライアントが何らかの方法でこの ID をハードコーディングしており、変更する必要がある場合に PK のクライアントが影響を受けることです。
解決策は、一意の名前を持つロール オブジェクトやレルムなどの項目の自然キーを公開し、一緒に一意性を保証することですが、これらの値のいずれかを更新するのが課題であるため、更新する古い値と新しい値を指定するか、2 つの値を渡す必要があります。元のオブジェクトと新しいオブジェクトにオブジェクトがあるため、更新するオブジェクトを見つけることができます。なんだか乱雑な、
別のアプローチは、代替キーを作成し、これをクライアントに公開して、クライアントがそれを好きなだけ使用できるようにすることです。これは PK に関連付けられていないため、気にしません。
最近は誰もが問題のないエンティティの ID として PK を使用しているようですが、昔ながらのプログラミングの時代からの退役軍人チームをどう説得すればよいのかわかりません。
もう 1 つの問題は、部分的な更新をサポートする方法です。問題は、10 のプロパティ、4 つのコレクションなどを持つエンティティがあることです。名前 + レルムのコンボを使用して、オブジェクト全体の変更 1 フィールドをプルダウンする代わりに、更新するプロパティを指定し、更新のために送り返します。コレクションを遅延ロードすると言っていますが、部分的な更新が意味があるかどうかはわかりません。
考えは?
ありがとう!
解決
セキュリティ フレームワークに対する私のアプローチは次のようになります。
データベース内のあらゆるものに内部 ID (ID 列、シーケンスなど、データベースがサポートするものであれば何でも) を与えます。Hibernate では「ネイティブ生成 ID 列」と話します)。最終的にはそれが必要になり、後付けするのは大変な作業です。
ユーザーに ID を渡す必要がある場合は、乱数を生成し、それが既に使用されていないことを確認し、内部 ID に関連付けてからユーザーに渡します。 一度もない 内部IDを渡して、 一度もない クラッカーが推測できる ID を使用してください。
部分的な更新に関しては、多数の属性を持つ多数のオブジェクトがある場合にのみ意味を持ち始めます。10 個の属性については、「時期尚早な最適化."
他のヒント
あなたがクライアントにIDを公開する必要がある場合は、自然キーを使用してください。これは、実装するのは簡単ではありませんが、それは正しい方法です。
あなたはそれらの部分更新について少し詳しく説明してもらえますか?私はそれを取得できませんでした。 :/
主キーがトラブルを求めように聞こえるよう、すべてのテーブルの上にGUIDを使用します。私は本当にあなたを誤解していない限り、どこでも撮影したこのアプローチを見ていません。理由だけではなく、すべてのユーザーにUIDを発行し、UIDで動作しない?
このアプローチは、すべての企業間で最も一般的です。あなたはセキュリティの観点から、通りであったとして法的に大丈夫ですので、UIDは PII のではありません。