2016-10-11 3 views
0

내 응용 프로그램에서 id 필드를 난독 화하는 메커니즘을 구현하고 싶습니다. 현재 모든 id 필드는 정수입니다. id 필드에 해당하는 임의의 문자열을 생성하기 위해 일종의 가역 해싱을 사용하고 싶습니다. 또한 전체 프로젝트를 최소한으로 변경하여이 작업을 수행하려고합니다.Sails.js : 미들웨어에서 req.params에 액세스하여 수정하는 방법

내 마음에 들었던 한 가지는 모든 요청 및 응답 개체를 차단하고 id 필드가 있는지 확인하기 위해 미들웨어를 작성하는 것이 었습니다. 요청에 id 필드가 들어 있고이 버전이 난독 화 된 버전 인 경우 문자열을 디코딩하고 요청 매개 변수를 정수 ID로 바꿉니다.

응답에 정수 ID가 포함 된 경우 엔 코드 함수를 실행하여 난독 화 된 ID를 클라이언트에 보냅니다.

제가 직면 한 문제는 req 개체를 수정하는 것입니다. id 필드는 req.body 또는 req.params 또는 res.query에있을 수 있습니다. 그러나 미들웨어에서는 ID 필드가있는 경우이를 볼 수 없습니다 (req.params).

정책을 사용해 보았습니다. 하지만 내가 겪고있는 문제는 심지어 req.params을 변경 한 후에도 컨트롤이 컨트롤러에 도달하면 변경 내용이 손실됩니다. 이 문제를 해결하기위한 권장 방법은 무엇입니까? 정책에서

: 난 그냥 req.params, req.query 및 req.body의 값을 수정하고

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.query 및 req.body의 값이 정책에서 변경된대로 수정 된 값이됩니다. 그러나 req.params는 클라이언트가 보낸 내용으로 다시 변경되고 정책의 변경 내용은 손실됩니다.

+0

일부 코드, pls? – SkyQ

+0

@SkyQ : 몇 가지 샘플 코드가 추가되었습니다. 나는 지금 많이하고 있지 않다. req.params, req.query 및 req.body의 값을 변경하는 것. –

답변

0

나는 정책과 미들웨어가 혼동 스럽다고 생각하십니까? 위의 코드가 api/정책에 있습니까? 그렇다면 구성/정책에서이 정책이 적용되는 컨트롤러를 정의해야합니다. 내가 추가 할 또한

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

Gitter 응답 : sgress454 sgress454 10시 45분 정책에서

, mandeepm91 @ @ 나는 req.body 또는 req.query 변경 사항을 변경하는 경우 다음 정책이나 컨트롤러에서 지속된다. 그러나 req.params에 대한 변경 사항은 손실됩니다. req.options의 주요 사용 사례 중 하나입니다.이 객체는 다음에 전달되기 전에 하나의 핸들러에 의해 변경 될 수있는 요청 데이터를 저장하는 데 사용됩니다. req.params 오브젝트는 각 핸들러에 원래 요청 매개 변수의 사본을 제공하기위한 것입니다. 이 접근 방식은 목표가 무엇인지에 따라 다릅니다. ID의 인코딩 된 버전을보기 위해 각 요청 처리기 (즉, 정책 및 컨트롤러 작업)가 필요하다면 @ S-Stephen이 제안한 정책에서 ID를 인코딩하고 req에 해당 값을 저장하는 것이 좋습니다 .options.id를 참조하고 다른 요청 핸들러의 참조를 참조하십시오. 반면에 인코딩 된 ID가있는 응답에만 관심이 있다면 res.send() 또는 res.json 대신 핸들러에서 res.ok() 응답을 사용하는 것이 좋습니다. 송신하기 전에 api/responses/ok.js에서 해당 응답의 코드를 조정하여 ID를 인코딩하십시오. 특정 요청에만 필요하면 사용자 정의 응답을 사용할 수도 있습니다. 자세한 내용은 맞춤 응답을 참조하십시오. 안녕하세요 @ sadlerw, api/responses/ok.js 파일에서 res.ok() 코드를 수정하여 모든 응답에 대해 원하는 경우 항상 JSON을 반환하도록 할 수 있습니다. 특정 동작에 대해서만 원하는 경우, 대신 사용자 지정 응답을 만들어 적절한 위치에서 사용할 수 있습니다.

+0

나는 정책과 미들웨어를 혼동하지 않는다. 나는 둘 다 시도했다. 미들웨어에서는 req.params가 정의되지 않았기 때문에 req.params에 액세스하는 방법을 파악할 수 없었습니다. 정책에서는 액세스 할 수 있었지만 컨트롤러 작업이 실행되면 수정이 손실되었습니다. 나는 policy.js에서 정책을 컨트롤러 액션에 붙이기 위해 필요한 변경을했다. –

+0

나는 거터에 대한 훌륭한 설명을 본다. 앞으로도 같은 문제가있는 사람들을 돕기 위해 거절 한 응답으로 원래 답변을 업데이트 할 것입니다. – ktravelet

관련 문제