Javascript 帐户用户界面使用的个性化密码验证功能

Javascript 帐户用户界面使用的个性化密码验证功能,javascript,meteor,meteor-accounts,Javascript,Meteor,Meteor Accounts,Meteor帐户使用验证密码格式: validatePassword = function (password) { if (password.length >= 6) { return true; } else { loginButtonsSession.errorMessage("Password must be at least 6 characters long"); return false; } }; 是否可以覆盖此功能?如果是这样的话,怎

Meteor帐户使用验证密码格式:

validatePassword = function (password) {
  if (password.length >= 6) {
    return true;
  } else {
    loginButtonsSession.errorMessage("Password must be at least 6 characters long");
    return false;
  }
};
是否可以覆盖此功能?如果是这样的话,怎么办?

根据流星不发送的密码,在清除通过电线。这就是为什么您无法轻松检查服务器上的密码

不过,您可以执行以下操作之一:

  • 通过自定义meteor方法创建用户

    您可以构建一个自定义登录表单,该表单调用服务器上定义的Meteor.method。 在此meteor方法中,调用Account.createUser()

    示例代码(未测试):

Meteor.methods({
createUser:函数(电子邮件、密码){
如果(密码长度<5){
抛出新的Meteor.Error('密码太短','使用更长的密码');
}
Accounts.createUser({email:email,password:password});
}
});
Meteor.call('createUser',电子邮件,密码); 警告:密码以明文形式发送到服务器。确保使用SSL保护您的DDP连接

  • 检查客户端上的密码

    当然,您永远不应该信任客户端,但用户修改客户端JavaScript代码只是为了设置更简单的密码的可能性不大


取决于您使用的框架。但理想情况下,您可以使用正则表达式并在前端和后端进行验证。例如:

if (Meteor.isClient) {
  Template.register.events({
    'submit form#password-form': function (e, template) {
      let pass = $(e.target).find('input[type="password"]');
      let passwordRegex = /\w{4,20}/gi   // this is just an example
      if (!passwordRegex.test(pass)) {
        // update dom as needed
      } else {
        Meteor.call('registerUser', $(e).serialize(), function (err, done) {
          if (!err) {
            // update for success
          } else {
            // update for failure
          }
        })
      }
    }
  });
} else {
  Meteor.methods({
    'registerUser': function (formObj) {
      check (formObj.password, String); // do all the checks first
      if (!/\w{4,20}/gi.test(formObj.password)) {
        throw new Meteor.Error(401, "Invalid password");
      }
    }
  });
}

对于有相同问题的人,这是我的解决方案

例如,将最小密码长度从默认值6增加到8:

在客户端文件夹中添加以下代码

 Accounts._loginButtons.validatePassword = function (password) {
  if (password.length >= 8) {
    return true;
  } else {
    Accounts._loginButtonsSession.errorMessage("Password must be at least 8 characters long");
    return false;
  }
};

简短的回答是否定的,它不可能直接覆盖
validatePassword
,因为它是未设置样式的
帐户ui的私有包。但是,可以(尽管不一定推荐)重写将密码传递给服务器的客户端函数,以便它们首先执行自定义验证。具体来说,您可以这样做:

//client only code

myValidatePassword = function (password) {
  if (password.length < 8) {
    throw new Meteor.Error("invalid-password", "Password must be at least 8 characters long");
  }
};

/* returns a function that will call beforeFunc(arguments) and 
   then call origFunc(arguments), using context for 'this' in 
   both cases. If beforeFunc throws an exception and the last 
   argument is a function, then that argument is assumed to be a
   callback function, and the callback function will be called 
   with the error.
   */
function addCallBefore(context, origFunc, beforeFunc) {
  return _.wrap(origFunc, function () {
    var args = _.rest(arguments);
    try {
      beforeFunc.apply(context, args);
    } catch (ex) {
      var callback = _.last(args);
      if (_.isFunction(callback)) {
        callback(ex);
        return;
      } else {
        throw ex;
      }
    }
    return origFunc.apply(context, args);
  });
}

Accounts.createUser = addCallBefore(Accounts, Accounts.createUser, function (options) {
    myValidatePassword(options.password);
});

Accounts.changePassword = addCallBefore(Accounts, Accounts.changePassword, function (oldPassword, newPassword) {
    myValidatePassword(newPassword);
});

Accounts.resetPassword = addCallBefore(Accounts, Accounts.resetPassword, function (token, newPassword) {
    myValidatePassword(newPassword);
});
//仅客户端代码
myValidatePassword=函数(密码){
如果(密码长度<8){
抛出新Meteor.Error(“密码无效”,“密码长度必须至少为8个字符”);
}
};
/*返回将调用beforeFunc(参数)和
然后调用origFunc(参数),在中使用“this”的上下文
这两种情况。如果beforeFunc抛出异常,则
参数是函数,则假定该参数是函数
回调函数,并且将调用回调函数
带着错误。
*/
函数addCallBefore(上下文、origFunc、beforeFunc){
return.wrap(origFunc,函数(){
var args=u0.rest(参数);
试一试{
beforeFunc.apply(上下文,参数);
}捕获(ex){
var callback=\最后一次(args);
if(uu.isFunction(回调)){
回调(ex);
返回;
}否则{
掷骰子;
}
}
返回origFunc.apply(上下文,参数);
});
}
Accounts.createUser=addCallBefore(Accounts,Accounts.createUser,函数(选项){
myValidatePassword(options.password);
});
Accounts.changePassword=addCallBefore(Accounts,Accounts.changePassword,函数(oldPassword,newPassword){
myValidatePassword(新密码);
});
Accounts.resetPassword=addCallBefore(Accounts,Accounts.resetPassword,函数(令牌,newPassword){
myValidatePassword(新密码);
});
这说明了这一点


另一种选择是使用软件包套件,而不是
帐户ui
useraccounts
套件提供。

如果你想编辑帐户用户界面,你必须深入代码,看看你是否可以重新定义它,或者你是否可以创建自己的帐户创建逻辑,我相信这个问题是相关的。应该有一种推荐的方式,如“流星方式”(就像有一种“Rails方式”)来解决这个标准问题。Meteor文档中目前还没有提到这一点。您可能还希望参考Python的Zen“应该有一种——最好只有一种——显而易见的方法来做到这一点。”。原始的meteor accounts函数在此文件中:-出于某种原因,Stackoverflow编辑器编辑了该链接…感谢您回答并对Stack Overflow做出贡献,但是请再次查看该问题,因为根据该文件,该问题似乎与主题无关。回答离题的问题让人觉得问这样的问题是可以的——事实并非如此。离题问题可能会被关闭,然后被删除,这将使您的贡献无效!谢谢你的提示。虽然我认为这个问题是相关的,但可能有一个不同的标题,比如“Meteor帐户的服务器端密码验证”。。。总而言之,它不是真的可以挽救的。感谢您的回答和对堆栈溢出的贡献,但是请再看一看这个问题,因为根据报告,它似乎是离题的。回答离题的问题让人觉得问这样的问题是可以的——事实并非如此。离题问题可能会被关闭,然后被删除,这将使您的贡献无效!你确定这真的有效吗?我在meteor代码中看到的对
validatePassword()
的所有调用都没有
this
arg,因此它们仍然会执行meteor定义的
validatePassword()
函数。我已经确认这不起作用。请参阅。@DeanBrettle-有趣-您的MeteoPad使用帐户ui未设置样式-我使用的是ian:accounts-ui-bootstrap-3。您最初的问题链接到
帐户ui未设置样式
,因此我假设您想在使用该软件包时验证密码。有多种帐户用户界面软件包支持自定义验证,但不使用
未设置样式的帐户用户界面
。除了
ian:accounts-ui-bootstrap-3
,另一套流行的软件包是套件。