3

我扩展了 apostrophe-express 模块实现逻辑以检查请求标头中的 cookie。此检查中的一种情况是自动登录用户。如果 cookie 键/值与预设标志值匹配,那么我想在 aposUsersSafe 集合中查找用户(基于电子邮件地址),如果用户存在于集合中,则自动将他登录到 cms .

目前,我已经通过基于电子邮件为用户运行 mongo 查询来实现用户查找:

var collection = 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');
      }

但是我看到撇号登录模块提供了通过护照进行身份验证和权限的方法。扩展撇号登录和护照是否可以实现这种自动登录解决方案?谢谢!

4

1 回答 1

4

正如我在回答您之前的问题时提到的,我是 P'unk Avenue 的 Apostrophe 的主要建筑师。

在我们的演示项目中实际上有一个完整的自动登录实现,可以借用(:我们希望自动登录用户,这样人们甚至在看到用户界面之前就不会放弃。

它很短,所以这里是:

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);
    };
  }
};

当然,您需要通过将其与其余部分一起包含在属性demo-autologin中来启用该模块。app.jsmodules

以下是该模块的工作原理:

  1. 它提供了一个pageBeforeSend方法,该方法在页面发送到浏览器之前被调用。

  2. 它检查demo_autologincookie 是否已经设置。

  3. 如果没有,它通过模块方法admin提供的光标找到用户,使用绕过通常会限制可以找到的权限检查。findapostrophe-userspermission(false)

  4. 它调用req.login,提供的一种方法passport使得以编程方式登录用户变得非常容易。

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

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

当然,您会根据不同的标准来决定寻找哪个用户,而不是“让每个人都成为管理员”,但听起来您已经掌握了这部分,并且此代码应该很容易适应您的需求。

(在我看来,如果用户甚至拒绝接受一个普通的旧会话 cookie,这段代码可能会遇到重定向循环。常规登录无论如何都不起作用,但如果你愿意,你可以通过查询字符串跟踪情况并告诉用户如果他们两次到达这里就启用 cookie。)

此答案已更正以包含 的req论点find

于 2016-10-03T23:20:34.487 回答