2013-04-08 6 views
6

私はa previous discussion I had with Jon Skeetから外に出ています。クライアントで生成されたGUIDを信頼できないのはなぜですか? PKをクライアントGUIDとサーバーGUIDの複合体として扱うことは何も解決しますか?

次のように私のシナリオの要旨は次のとおりです。

  • クライアントアプリケーションデータベースに永続化する必要がある新しい「PlaylistItem」オブジェクトを作成する能力を持っています。
  • ユースケースでは、PlaylistItemを表示する前にクライアントがサーバーからの応答を待つ必要がないように、PlaylistItemを作成する必要があります。
  • クライアントは、PlaylistItemのUUIDを生成し、クライアントにPlaylistItemを表示してから、サーバーにsaveコマンドを発行します。

この時点では、クライアントが生成したUUIDをデータベースのオブジェクトのPKとして使用することは悪い習慣であると私は理解しています。この理由は、悪意のあるユーザーが生成されたUUIDを変更し、自分のDBでPKの衝突を強制する可能性があるためです。

PlaylistItemでのPK衝突を引き起こすことに起因する損害を軽減するために、私はクライアント生成UUIDとサーバー生成GUIDの2つのIDの複合としてPKを定義することを選択しました。サーバーが生成したGUIDは、PlaylistItemのプレイリストのIDです。

私はこのソリューションをしばらく使用していましたが、なぜ私のソリューションが単にクライアントIDを信頼するよりも優れているとは思えません。ユーザーが別のユーザーのPlaylistItemオブジェクトとPK collisonを強制できる場合、そのユーザーのPlaylistIdも提供できると想定する必要があります。彼らはまだコリソンを強制することができます。

だから...はい。このようなことをする正しい方法は何ですか?クライアントがUUIDを作成できるようにします。サーバーは、正常に保存されたときに親指を上/下に表示します。衝突が見つかった場合は、クライアントの変更を元に戻し、検出されたcollisonを通知しますか?

答えて

2

素敵なソリューションは、次のようになります。サム・ニューマンの"Building Microservices"を引用すると:

呼び出しシステムは、おそらくファイルには、すべてのデータを配置することができます 場所に渡し、BatchRequestをPOSTでしょう。お客様の サービスは、 要求が受け入れられたがまだ処理されていないことを示すHTTP 202応答コードを返します。それが作成された201 を取得するまでの呼び出し その後、システムは、だからあなたの場合には、あなたがサーバーにポストが、すぐに私が保存されます」のような応答を得ることができ、要求が

を成就されたことを示す待っているリソースをポーリングすることができPlaylistItemと私はそのIdがこれとなることを約束します "。クライアント(およびユーザー)は、サーバ(APIではないかもしれないが、APIからのメッセージを受け取ったいくつかのバックグラウンドプロセッサ)がエンティティをセーブするまで、処理、検証、その他の処理を行います。先に述べたように、APIはリクエストのステータスにGETエンドポイントを提供することができ、クライアントはそれをポーリングしてエラーの場合に応じて動作することができます。

1

クライアントが生成したUUIDまたは同様のグローバル一意識別子をサーバー上で信頼します。ちょうどそれを分かりやすくしてください。

ほとんどのテーブル/コレクションは、userIdを保持するか、FKを介してuserIdに自分自身を関連付けることができます。

挿入を行っていて、悪意のあるユーザーが既存のキーを使用している場合、レコード/ドキュメントが既に存在するため、挿入が失敗します。

更新を行っている場合は、ログインしたユーザーがそのレコードを所有しているか、更新されていることを確認する必要があります(管理ユーザーなど)。純粋な所有権が強制されている場合(つまり、管理者のシナリオがない場合)、レコード/文書の検索にはwhere句にIdとuserIdの両方が含まれます。技術的には、idは一意にレコード/ドキュメントを見つけるので、where句でuserIdが重複しています。ただし、userIdを追加すると、レコードが悪意のあるユーザーではなく更新を行っているユーザーに属していることが確認されます。

暗号化されたトークンや、サーバーが解読してuserIdを確認するセッションがあると想定しています。そうでない場合は、クライアントからはそれが提供されていません。

関連する問題