2014-12-02 3 views
3

일부 기준이 충족되면 비밀번호를 암호화해야합니다. 조건부 before 돛의 업데이트

beforeUpdate: function (value, cb) { 
User.findOne(value.id) 
    .exec(function (err, originalUser) { 
    if (err || !originalUser) { 
     return cb(); 
    } 
    //encrypt the password only if the password is not previously encrypted 
    if (value.password != originalUser.password) { 
     //encrypt the Pwd 
    } else { 
     cb(); 
    } 
    }); 

} 문제

는 값 오브젝트는 내가 값 객체의 전체 사용자 개체를 얻을 수있는 방법, 업데이트 PARAMS이 포함되어 있다는 것입니다?

+2

확실하지,하지만 어떻게 당신은 왜 다른 PARAMS을 필요로하는 업데이트되지 않습니다. 원래 사용자와 동일합니다. –

+2

이미 'originalUser'에 이미 전체 사용자 객체가 있습니까? – myusuf

+0

아니요, value.id가 정의되지 않았기 때문에 .. –

답변

1

왜 여기에 값 개체가 필요한지 잘 모르겠지만 전체 사용자 개체를 가져 와서 'next()'콜백을 보내 업데이트 할 수있는 사용자 지정 정책을 만들 수 있습니다.

+0

아이디어 나 예제 어떻게해야합니까? – taufique

+0

@taufique 방금 게시 한 답변을 참조하십시오. 이는 저에게 효과가있는 예입니다. – Telgin

+0

@taufique 빠른 답변을위한 내 대답보기 – hasan3050

1

원본 사용자의 값을 늘리려면 로다시를 사용하십시오. 또는이 유스 케이스의 경우 노드 bcrypt 또는 무언가를 사용하는 경우 항상 패스워드가 해쉬되어 있는지 확인할 수 있습니다

1

이제 Update 메소드에서 password : password를 보내면 암호가 해시 및 저장됩니다) 그렇지 않으면 제공된 사용자 필드 만 업데이트합니다.

컨트롤러 (UserController.js) :

updateDisplayName: function(req, res) { 

var userid = req.token; 
var newDisplayName = req.param('newdisplayname'); 

User.update({id: userid},{displayname: newDisplayName}).exec(function afterwards(err,updated){ 

if (err) { 
res.json(err); 
} else { 
res.json("Success"); 
} 
}); 

}, 

모델 (의 user.js) :

beforeUpdate: function(values, next) { 
if(values.password) { 
hashPassword(values, next); 
} else { 
next(); 
} 
}, 
2

이 무엇을 제안 user3036010을 확장하려면,이 같은 새 정책을 만들 결국 :

api/policies/propagateId.js에서 :

module.exports = function(req, res, next) { 
    var id = req.param('id'); 
    if (id && req.body) { 
     req.body.id = id; 
    } 

    next(); 
}; 

그런 다음 모든 컨트롤러와 액션에 기본적으로 정책을 적용하기 위해 api/config/policies.js 파일을 설정 :

module.exports.policies = { 
    '*': 'propagateId' 
}; 

이는 문서 본문에 설정 될 id 속성을 강제로입니다 무엇을하는 트릭 업데이트 행동으로 id을 수동으로 지정했다고 생각했습니다. 어떤 이유로 든 업데이트 작업에이 것을 확인하는 코드 블록이 있으며, id이 수동으로 지정되지 않으면 값에서 제거됩니다.

이것은 정책의 남용의 일종이지만, 나를 위해 잘 작동하는 것 같습니다. 이런 식으로하고 싶지 않다면 업데이트 요청을 할 때마다 요청 본문에 수동으로 id을 지정하는 것처럼 보입니다.

5

비동기 업데이트 후이 방법은 더 이상 작동하지 않습니다.

beforeUpdate 안에 전체 개체를 가져올 수 없습니다. 당신은이 ID를 얻기 위해 이것을 시도 할 수 있습니다. var id= this.update.arguments[0]

+0

그냥 작동합니다. 너무 더럽지만 그냥 작동합니다. –

+4

주의 - 비동기의 변경으로 인해 더 이상 작동하지 않습니다. – Leo

+1

이 더 이상 작동하지 않습니다. – Adil

1

나는 비슷한 것을하려고했는데, 관련된 패스포트 레코드에 패스워드를 저장했다. 나는 sails-auth와 sails-permissions 모듈을 사용하고 있는데 여기에는 여권이 포함되어있다.

beforeUpdate 콜백 대신 afterValidate lifecycle callback을 사용하여 마침내 할 수있었습니다. afterValidate 콜백에서 this.user을 사용하여 사용자 모델에 액세스 할 수 있습니다.

여기 내가 여권 모델을 사용하여 전달 된 암호 저장 내 afterValidate 콜백에 넣어 코드이다 : 나는 명확하게 이해할 수 있어요 경우

afterValidate: function(updates, next) { 
    // Update the passport password if it was passed in 
    if(updates.password) { 
    Passport.update({user: this.user.id}, {password: updates.password}).exec(function(err, passport) { 
     next(err); 
    }); 
    } 
    else { 
    next(); 
    } 
}