当 emailVerified 为 false 时环回停止登录

Loopback stop login while emailVerified is false

我有一个自定义用户模型(用户扩展),我想实现一个经典的双重选择,并且在 emailVerified 为 false 时不允许登录,我试过像这样编写一个 afterRemote 方法

    var app = loopback();
        app.currentUser = false; 


    user.afterRemote('login', function(context, user, next) {

      var UserModel = app.models.User;

      UserModel.findById(user.userId, function (err, usr) {

         if (err) {

           return next(err);
         }

         if ( !usr ) {

           return next(new Error('could not find a valid user'));
         }

         console.log('> USER SEARCH: %j', usr);

         next();
    });

但 UserModel 未定义。

这是在环回中实现双重选择的错误方法吗?

您需要使用 beforeRemote 挂钩,因为您想要停止登录操作,使用 afterRemote 挂钩,登录已经发生。但是,根据您共享的代码,我不确定您是如何执行此操作或将此代码放在哪里的。您似乎将钩子连接到 user,但是您还是从 app 上取下了 User 模型?

我认为您需要扩展核心 User 模型才能做到这一点。因此,创建一个 新模型,其中 User 作为其 base:

{
  "name": "MyUser",
  "base": "User",
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": []
}

然后在 /common/models/MyUser.js 文件中你有这个:

module.exports = function(MyUser) {
  MyUser.beforeRemote('login', function(context, unused, next) {

    MyUser.findOne(
      // assuming they log in with their email address...
      { where: { email: context.req.body.email } },
      function (err, user) {
         if (err || !user) {
           return next(err || (new Error('No user found')));
         }

         if (!user.emailVerified) {
           return next(new Error('You need to verify your email first!'));
         }

         next();
    });
};