假设应用程序用户模型名为MyUserModel,并继承自内置模型User。
你有两个选择:
-
如果你只能在 AngularJS/客户端工作。
在 MyUserModel 上使用 update 远程方法(PUT 请求)并指定
{ "password":"...newpassword..."}
在体内。
但是,为了对新密码实施安全策略,使用特定的远程方法可能比这个技巧更方便。
-
如果你可以在 NodeJS / LoopBack 服务器端工作。
这是我在 LoopBack / StrongLoop - IBM 项目中实现特定 updatePassword 远程方法的“完整”解决方案。
请验证loopback-datasource-juggler 包的版本是否高于或等于 2.45.1 (npm list loopback-datasource-juggler)。
“我的用户模型.js”
module.exports = function (MyUserModel) {
...
MyUserModel.updatePassword = function (ctx, emailVerify, oldPassword, newPassword, cb) {
var newErrMsg, newErr;
try {
this.findOne({where: {id: ctx.req.accessToken.userId, email: emailVerify}}, function (err, user) {
if (err) {
cb(err);
} else if (!user) {
newErrMsg = "No match between provided current logged user and email";
newErr = new Error(newErrMsg);
newErr.statusCode = 401;
newErr.code = 'LOGIN_FAILED_EMAIL';
cb(newErr);
} else {
user.hasPassword(oldPassword, function (err, isMatch) {
if (isMatch) {
// TODO ...further verifications should be done here (e.g. non-empty new password, complex enough password etc.)...
user.updateAttributes({'password': newPassword}, function (err, instance) {
if (err) {
cb(err);
} else {
cb(null, true);
}
});
} else {
newErrMsg = 'User specified wrong current password !';
newErr = new Error(newErrMsg);
newErr.statusCode = 401;
newErr.code = 'LOGIN_FAILED_PWD';
return cb(newErr);
}
});
}
});
} catch (err) {
logger.error(err);
cb(err);
}
};
MyUserModel.remoteMethod(
'updatePassword',
{
description: "Allows a logged user to change his/her password.",
http: {verb: 'put'},
accepts: [
{arg: 'ctx', type: 'object', http: {source: 'context'}},
{arg: 'emailVerify', type: 'string', required: true, description: "The user email, just for verification"},
{arg: 'oldPassword', type: 'string', required: true, description: "The user old password"},
{arg: 'newPassword', type: 'string', required: true, description: "The user NEW password"}
],
returns: {arg: 'passwordChange', type: 'boolean'}
}
);
...
};
“我的用户模型.json”
{
"name": "MyUserModel",
"base": "User",
...
"acls": [
...
{
"comment":"allow authenticated users to change their password",
"accessType": "EXECUTE",
"property":"updatePassword",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
}
...
],
...
}