自动登录用户到 Apostrophe
Auto login users to Apostrophe
我扩展了 apostrophe-express 模块实现逻辑以检查请求 headers 中的 cookie。此检查中的一种情况是自动登录用户。如果 cookie key/val 与预设标志值匹配,那么我想在 aposUsersSafe collection 中查找用户(基于电子邮件地址),如果用户存在于 collection,自动将他签入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
属性 中。
此模块的工作原理如下:
它提供了一个 pageBeforeSend
方法,该方法在页面发送到浏览器之前被调用。
它检查 demo_autologin
cookie 是否已经设置。
如果不是,则通过apostrophe-users
模块的find
方法提供的游标找到admin
用户,使用permission(false)
绕过通常会限制可以找到的内容的权限检查。
它调用 req.login
,这是 passport
提供的一种方法,它确实使以编程方式登录用户变得非常容易。
通过req.res.cookie
设置cookie。 res
对象总是可以从 req
访问,反之亦然。在 Apostrophe 中,通常只传递 req
,因为 req.res
可用,而且在大多数情况下,您将向 req
添加更多数据,而不是直接响应。
它重定向到主页,以便整个页面加载为登录体验。
自然地,您会根据与 "just make everybody admin," 不同的标准来决定寻找哪个用户,但听起来您已经掌握了这一部分,并且此代码应该很容易适应您的需求。
(我突然想到,如果用户甚至拒绝接受一个普通的旧会话 cookie,此代码可能会遇到重定向循环。无论如何,常规登录将无法正常工作,但如果你愿意,你可以跟踪通过查询字符串的情况,并告诉用户如果他们两次到达这里就启用 cookie。)
此答案已更正为包括 find
的 req
参数。
我扩展了 apostrophe-express 模块实现逻辑以检查请求 headers 中的 cookie。此检查中的一种情况是自动登录用户。如果 cookie key/val 与预设标志值匹配,那么我想在 aposUsersSafe collection 中查找用户(基于电子邮件地址),如果用户存在于 collection,自动将他签入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
属性 中。
此模块的工作原理如下:
它提供了一个
pageBeforeSend
方法,该方法在页面发送到浏览器之前被调用。它检查
demo_autologin
cookie 是否已经设置。如果不是,则通过
apostrophe-users
模块的find
方法提供的游标找到admin
用户,使用permission(false)
绕过通常会限制可以找到的内容的权限检查。它调用
req.login
,这是passport
提供的一种方法,它确实使以编程方式登录用户变得非常容易。通过
req.res.cookie
设置cookie。res
对象总是可以从req
访问,反之亦然。在 Apostrophe 中,通常只传递req
,因为req.res
可用,而且在大多数情况下,您将向req
添加更多数据,而不是直接响应。它重定向到主页,以便整个页面加载为登录体验。
自然地,您会根据与 "just make everybody admin," 不同的标准来决定寻找哪个用户,但听起来您已经掌握了这一部分,并且此代码应该很容易适应您的需求。
(我突然想到,如果用户甚至拒绝接受一个普通的旧会话 cookie,此代码可能会遇到重定向循环。无论如何,常规登录将无法正常工作,但如果你愿意,你可以跟踪通过查询字符串的情况,并告诉用户如果他们两次到达这里就启用 cookie。)
此答案已更正为包括 find
的 req
参数。