2016-10-11 2 views
0

私のアプリケーションでidフィールドを難読化する仕組みを実装したいと思います。現在、すべてのidフィールドは整数です。 idフィールドに対応するランダムな文字列を作成するために、ある種のリバーシブルハッシュを使用したいと思います。また、私はプロジェクト全体に最小限の変更を加えてこれを達成しようとしています。Sails.js:ミドルウェアのreq.paramsにアクセスして変更する方法

私の頭に浮かべたのは、すべてのリクエストとレスポンスオブジェクトを傍受し、idフィールドの有無をチェックするためのミドルウェアを書くことでした。要求にidフィールドが含まれており、難読化されたバージョンの場合は、文字列をデコードし、要求パラメータを整数IDに置き換えます。

応答に整数IDが含まれる場合は、encode関数を実行して難読化されたIDをクライアントに送信します。

私が直面している問題は、reqオブジェクトを変更することです。 idフィールドは、req.bodyまたはreq.paramsまたはres.queryに存在できます。しかし、ミドルウェアでは、IDフィールドが存在するときはIDフィールドが表示されません(req.params)。

ポリシーを使用しようとしました。しかし、私がそこに直面している問題は、req.paramsを変更した後でさえ、コントロールがコントローラに達すると変更が失われます。この問題を解決するにはどうすればよいでしょうか?ここで

は、サンプルコードは次のとおりです。ポリシーで

module.exports = function (req, res, next) { 
    req.params.id = '12345'; 
    req.query.pageSize = 30; 
    req.body = {}; 

    sails.log.info('req.params', req.params); 
    sails.log.info('req.query', req.query); 
    sails.log.info('req.body', req.body); 
    return next(); 
}; 

私はちょうどreq.params、req.queryとreq.bodyの値を変更しています。

コントローラでこれらの値にアクセスしようとすると、req.queryとreq.bodyの値は、ポリシーで変更された変更された値になります。しかし、req.paramsはクライアントから送信されたものに変更され、ポリシーの変更は失われます。

+0

いくつかのコード、pls? – SkyQ

+0

@SkyQ:いくつかのサンプルコードを追加しました。今はあまりやっていません。 req.params、req.query、req.bodyの値を変更するだけです。 –

答えて

0

私はあなたがポリシーとミドルウェアを混乱させると思いますか?上のコードはapi/policiesにありますか?その場合は、このポリシーが設定/ポリシーで適用されているコントローラを定義する必要があります。また、私は追加したい

modue.exports.policies = { 
    // If you really want this policy for every controller and action 
    '*': 'policyName.js', 

    // If you want it for a specific controller. '*' denotes every action in controller 
    specificController: { 
     '*': 'policyName.js' 
    }, 

    // If you want it for a specific action on a specific controller 
    specificController: { 
     'specificAction': 'policyName.js' 
    } 

}; 

ので、設定/ policies.jsは次のようになります。ポリシーは一般的にコントローラの承認のためのものですが、これはまともなユースケースのようです。すべての単一の要求はこれらのフィールドを持たないので、これはポリシーでなければなりません。いくつかのコントローラー/アクションに何かを適用する場合、ポリシーは優れています。ミドルウェアは、アプリに含まれるすべてのアクションに適用する必要がある場合に最適です。

http://sailsjs.org/documentation/concepts/policies

http://sailsjs.org/documentation/concepts/middleware

ギッター応答: sgress454 sgress454 10時45 ポリシーで

、mandeepm91 @ @私はreq.bodyまたはreq.query、変更内容を変更した場合次のポリシーまたはコントローラで持続する。ただし、req.paramsに対する変更は失われます。 これはreq.optionsの主な使用例の1つです。このオブジェクトは、要求データを格納するために使用されます。要求データは、次のハンドラに渡される前に1つのハンドラによって変更される可能性があります。 req.paramsオブジェクトは、各ハンドラに元のリクエストパラメータのコピーを提供するためのものです。 これに実際にアプローチする方法は、目標が何であるかによって異なります。 IDのエンコードされたバージョンを確認するために各リクエストハンドラ(つまり、ポリシーとコントローラのアクション)が本当に必要な場合は、@ S-Stephenが示唆しているようにIDでIDをエンコードし、その値をreqに格納します.options.idを参照し、他のリクエストハンドラのものを参照してください。一方、エンコードされたIDを持つレスポンスだけに本当に関心がある場合は、res.send()またはres.jsonではなくハンドラでres.ok()レスポンスを使用することをお勧めします。送信する前にIDをエンコードするようapi/responses/ok.jsでその応答のコードを調整します。これが特定の要求にのみ必要な場合は、カスタム応答を使用することもできます。詳細については、カスタムレスポンスを参照してください。 こんにちは@sadlerw、api/responses/ok.jsファイル内のres.ok()のコードを変更して、すべての応答に必要な場合にJSONを返すようにする必要があります。特定のアクションにのみ必要なものなら、代わりにカスタムレスポンスを作成し、適切な場所で使用することができます。

+0

私はポリシーとミドルウェアを混乱させません。私は両方を試みた。ミドルウェアでは、req.paramsにアクセスする方法が未定義であるため、その方法を理解できませんでした。ポリシーでは、私はそれにアクセスすることができましたが、コントローラアクションが実行されると変更は失われました。私はpolicies.jsに必要な変更を加え、コントローラのアクションにポリシーを添付しました –

+0

私はあなたに巨人についての素晴らしい説明があるのを見ます!私は、同じ問題を抱えている人々を将来的に手助けするために、私の元の回答を頼りにして返信するつもりです。 – ktravelet

関連する問題