2016-10-03 46 views
3

我已经扩展了撇号快速模块实现逻辑来检查请求标头中的Cookie。此检查中的一种情况是自动登录用户。如果cookie key/val与预设的标志值相匹配,那么我想在aposUsersSafe集合中进行查找(基于电子邮件地址),并且如果用户存在于集合中,则会自动将其签入cms 。自动登录用户以撇号

目前,我已通过运行基于电子邮件的用户蒙戈查询实现用户查找:

变种集合= db.collection(“aposUsersSafe”);

collection.find({email: email}).toArray(function (err, result) { 
     if (err) { 
     deferred.reject(new Error(error)); 
     } else if (result.length) { 
     deferred.resolve(result); 
     } else { 
     console.log('User not found'); 
     } 

但我看到撇号登录模块通过护照提供身份验证和权限的方法。延伸撇号登录和护照是实现这种自动登录解决方案的方式吗?谢谢!

回答

3

正如我在回答你先前的问题时所提到的,我是P'unk Avenue的首席建筑师撇号。

实际上有我们的演示项目完全实现自动登录的,成熟的借款(:我们希望自动登录的用户,使人们甚至不会看到用户界面之前放弃

。这是很短的,所以在这里它是:

module.exports = { 
    construct: function(self, options) { 
    self.pageBeforeSend = function(req, callback) { 
     if (!req.cookies.demo_autologin) { 
     return self.apos.users.find(req, { username: 'admin' }).permission(false).toObject(function(err, user) { 
      if (err) { 
      return callback(err); 
      } 
      if (!user) { 
      return callback(null); 
      } 
      req.login(user, function(err) { 
      if (err) { 
       return callback(err); 
      } 
      // Start a whole new request, but logged in. After this they 
      // have the cookie so they can log out and back in normally if they want 
      req.res.cookie('demo_autologin', 1); 
      return req.res.redirect('/'); 
      }); 
     }); 
     } 
     return callback(null); 
    }; 
    } 
}; 

当然,你需要通过将其包括在modules财产,其余以启用app.jsdemo-autologin模块

下面是这个模块是如何工作的:

  1. 它提供了一个pageBeforeSend方法,只是前一个页面发送到浏览器都会调用。

  2. 它检查是否已设置demo_autologin cookie。

  3. 如果不是,它通过由apostrophe-users模块的find方法提供了一种光标找到admin用户,使用permission(false)绕过权限检查,通常会限制什么都可以找到。

  4. 它调用req.login,这是一个由passport提供的方法,它使得以编程方式记录用户非常容易。

  5. 它通过req.res.cookie设置cookie。总是可以从req访问res对象,反之亦然。在撇号中,通常只会传递req,因为req.res可用,因为在大多数情况下,您将向req添加更多数据,而不是直接响应。

  6. 它重定向到主页,以便整个页面加载为登录体验。

你自然会决定去寻找根据不同于标准哪个用户“只是让大家管理员”,但它听起来像是你有一部分手柄和该代码应该很容易适应您的需求。如果用户拒绝接受一个普通的旧会话cookie,那么这个代码可能会遇到一个重定向循环,但是如果你想要,常规登录不会工作,但如果你愿意,你可以跟踪情况通过查询字符串,并告诉用户启用cookie,如果他们在这里两次。)

此答案已更正,包括req参数find