首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动登录Apostrophe用户

自动登录Apostrophe用户
EN

Stack Overflow用户
提问于 2016-10-03 16:53:47
回答 1查看 346关注 0票数 3

我扩展了实现逻辑的撇号表达式模块,以检查请求头中的cookie。此检查中的一个情况是自动登录用户。如果一个cookie键/val匹配一个预设的标志值,那么我想对aposUsersSafe集合中的用户进行查找(基于电子邮件地址),如果用户存在于集合中,则自动将他签名到cms中。

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

var collection = db.collection('aposUsersSafe');

代码语言:javascript
复制
    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');
      }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-03 23:20:34

正如我在回答你之前的问题时提到的,我是彭克大道阿后托普的主要建筑师。

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

它很短,所以在这里:

代码语言:javascript
复制
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模块与其他模块一起包含在modules属性中,从而在app.js中启用它。

下面是这个模块的工作方式:

  1. 它提供了一个pageBeforeSend方法,该方法在页面被发送到浏览器之前被调用。
  2. 它检查demo_autologin cookie是否已经设置。
  3. 如果没有,则通过admin模块的find方法提供的游标查找apostrophe-users用户,使用permission(false)绕过权限检查,这些检查通常会限制查找的内容。
  4. 它调用req.login,这是passport提供的一种方法,它使以编程方式登录用户变得非常容易。
  5. 它通过req.res.cookie设置cookie。res对象始终可以从req访问,反之亦然。在Apostrophe中,通常只传递req,因为req.res是可用的,而且在大多数情况下,您将向req添加更多数据,而不是直接响应。
  6. 它重定向到主页,以便整个页面作为登录体验加载。

当然,你会根据不同的标准来决定寻找哪个用户,而不是“让每个人都管理”,但是听起来你对这个部分有一个处理方法,这段代码应该很容易适应你的需求。

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

这个答案已经更正为将req参数包含到find中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39836621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档