非常简单的问题:如果我尝试在用户模型中验证密码,我似乎只能验证已加密的密码? 例如,如果我使用
Customer.validatesLengthOf('password', { min: 8, message: 'Too short' })
然后检查加密密码(总是超过8个字符),所以没有好...如果我尝试使用自定义验证,我怎样才能访问原始密码(原始的req.body。密码基本上)?
答案 0 :(得分:0)
好的,没有回答,所以我正在做的是使用远程钩子来访问原始的普通密码,而且现在就做了。
var plainPwd
Customer.beforeRemote( 'create', function (ctx, inst, next) {
plainPwd = ctx.req.body.password
next()
})
然后我可以在自定义验证中使用它:
Customer.validate( 'password', function (err, res) {
const pattern = new RegExp(/some-regex/)
if (plainPwd && ! pattern.test( plainPwd )) err()
}, { message: 'Invalid format' })
答案 1 :(得分:0)
好吧我猜上面的答案非常新颖,显然已被接受,但是如果你想要一个真正简单的解决方案,只需要完成一些基本的验证而且代码不多,那么loopback-mixin-complexity就是你的解决方案。
如果您不想创建另一个依赖项,那么您可以继续使用自定义mixin,您可以将其添加到您的用户模型或需要某种验证的任何其他模型中,它会执行此操作为你验证。
以下是如何创建此类mixin的示例代码
module.exports = function(Model, options) {
'use strict';
Model.observe('before save', function event(ctx, next) { //Observe any insert/update event on Model
if (ctx.instance) {
if(!yourValidatorFn(ctx.instance.password) )
next('password not valid');
else
next();
}
else {
if(!yourValidatorFn(ctx.data.password) )
next('password not valid');
else
next();
}
});
};
答案 2 :(得分:0)
实际上,这是known problem的环回。 tacitly approved解决方案是override the <UserModel>.validatePassword()
method with your own。 YMMV。
akapaul于2017年1月10日发表评论•
我找到了另一种方法。在普通模型用户中,有一个 称为validatePassword的方法。如果我们从User扩展UserModel, 我们可以在JS中重新定义此方法,如下所示:
var g = require('loopback/lib/globalize'); module.exports = function(UserModel) { UserModel.validatePassword = function(plain) { var err, passwordProperties = UserModel.definition.properties.password; if (plain.length > passwordProperties.max) { err = new Error (g.f('Password too long: %s (maximum %d symbols)', plain, passwordProperties.max)); err.code = 'PASSWORD_TOO_LONG'; } else if (plain.length < passwordProperties.min) { err = new Error(g.f('Password too short: %s (minimum %d symbols)', plain, passwordProperties.min)); err.code = 'PASSWORD_TOO_SHORT'; } else if(!(new RegExp(passwordProperties.pattern, 'g').test(plain))) { err = new Error(g.f('Invalid password: %s (symbols and numbers are allowed)', plain)); err.code = 'INVALID_PASSWORD'; } else { return true; } err.statusCode = 422; throw err; }; };
这对我有用。我不认为g(全球化)对象是必需的 在这里,但是我添加了这个,以防万一。另外,我添加了验证器 由于回送文档的原因,UserModel的JSON定义中提供了选项