apostrophe-cms - 自动登录用户到 Apostrophe

标签 apostrophe-cms

我扩展了 apostrophe-express 模块实现逻辑以检查请求 header 中的 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');
      }

但我看到 apostrophe-login 模块提供了通过护照进行身份验证和权限的方法。扩展 apostrophe-login 和 passport 是实现这个自动登录解决方案的方法吗?谢谢!

最佳答案

正如我在回答您之前的问题时提到的,我是 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);
    };
  }
};

当然,您需要在 app.js 中启用 demo-autologin 模块,方法是将其包含在 modules 属性中。

下面是这个模块的工作原理:

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

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

  3. 如果不是,它将通过 apostrophe-users 模块的 find 方法提供的游标找到 admin 用户,使用 permission(false) 绕过通常会限制可以找到的内容的权限检查。

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

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

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

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

(我突然想到,如果用户甚至拒绝接受一个普通的旧 session cookie,此代码可能会遇到重定向循环。无论如何,常规登录将无法正常工作,但如果您愿意,可以通过以下方式跟踪情况查询字符串并告诉用户如果他们到达这里两次则启用 cookie。)

此答案已更正为包括 findreq 参数。

关于apostrophe-cms - 自动登录用户到 Apostrophe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836621/

相关文章:

apostrophe-cms - 模板数据权限

apostrophe-cms - 向小部件添加自定义参数

node.js - 在 Apostrope CMS 中将 Twitter Bootstrap LESS 文件与 NPM 结合使用

linux - 撇号 : Image Manager hanging on replicated site

apostrophe-cms - 如何使用 Apostrope CMS 2 设置 nodemon?

apostrophe-cms - 为我的数据库添加种子,或在 ApostropeCMS 中以编程方式插入数据

javascript - Apostrope Js - 上传文件 (apostrope-pieces-submit-widgets)

apostrophe-cms - 如何将js脚本传递给特定的页面类型?

javascript - 撇号 cms - 自定义页面设置

apostrophe-cms - Apostrope CMS 中的自定义图片库