环回自定义密码验证

时间:2016-09-10 06:16:37

标签: validation model loopback

非常简单的问题:如果我尝试在用户模型中验证密码,我似乎只能验证已加密的密码? 例如,如果我使用

 Customer.validatesLengthOf('password', { min: 8, message: 'Too short' })

然后检查加密密码(总是超过8个字符),所以没有好...如果我尝试使用自定义验证,我怎样才能访问原始密码(原始的req.body。密码基本上)?

3 个答案:

答案 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定义中提供了选项