9

レプリケーション フィルターで使用されるリクエスト オブジェクト引数に関するドキュメントを見つけるのに問題があります (以下のサンプルでは「req」)。

function(doc, req) {
  // what is inside req???
  return false;
}

この古い CouchBase ブログ投稿には、リクエスト オブジェクトの一部である userCtx 変数を示す小さなコード スニペットがあります。

このuserCtxは何ですか? HTTP 基本認証、セキュア Cookie 認証、または OAuth を使用して CouchDB に対して認証済みのリクエストを行うと、CouchDB はユーザーの資格情報を検証します。それらが CouchDB ユーザーと一致する場合、ユーザーに関する情報を req.userCtx オブジェクトに取り込みます。

この userCtx オブジェクトは、ドキュメントの複製をドキュメントの所有者に制限するのに非常に役立ちます。この例をチェックしてください:

function(doc, req) {
  // require a valid request user that owns the current doc
  if (!req.userCtx.name) {
    throw("Unauthorized!");
  }
  if(req.userCtx.name == doc.owner) {
    return true;
  }
  return false;
}

しかし、ここでの問題は、CouchDB ではレプリケーションのイニシエーターがフィルター メソッドを明示的に選択する必要があることです (この場合、イニシエーターは私の Web アプリのモバイル ユーザーです)。

curl -X POST http://127.0.0.1:5984/_replicate \
-d '{"source":"database", \
     "target":"http://example.com:5984/database", \
     "filter":"example/filtername"
     }'

質問

ユーザーが自分のデータのみを複製するように制限するために、デフォルトで特定のフィルターを適用する方法はありますか? これを行う最善の方法は、Nginx などの CouchDB のフロント エンドを使用し、すべてのレプリケーション リクエストをそのフィルターを含むものに制限することだと考えています。考え?CouchDB の前に別のレイヤーを配置せずにこれを行う方法が大好きです。

4

1 に答える 1

6

データ レプリケーションは、ユーザーがデータを読み取ることができる場合に適しています。ユーザーが単一のデータベース内でデータを共有する場合、すべてのユーザーは、それらすべてをローカル ソファに複製する権利を持っています。したがって、単一の共有データベースを複数の個人用データ​​ベースに分割しない限り、ドキュメントの読み取り制限を適用することはできません。これは、このような状況の一般的な使用例です。

変更フィード フィルターの適用や、ビューなどの他のパラメーターを適用する方法はありません。ただし、リライトを使用して、事前定義されたクエリ パラメータまたは動的パラメータを使用して、一部のリソースへのリクエストをラップすることができます。これはあなたが期待した解決策とは少し異なりますが、nginx と彼の側のいくつかのロジックよりも優れています。おそらく、ユーザーがカスタム クエリ パラメーターを使用してカスタム フィルターを指定できるようにし、何も指定されていない場合にのみ自分のものであることを強制する必要があります。 、 右?

PS Insidereqオブジェクトは、現在のリクエストに関して非常に役立ちます。部分的にwikiに記載されていましたが、少し古くなっています。ただし、単純な show 関数を使用して簡単に表示できます。

function(doc, req){
    return {json: req}
}
于 2012-10-07T23:40:17.530 に答える