我正在使用Sails.js并尝试通过将用户信息保存到会话来进行简单登录。这是我的登录操作代码:
AuthService.login(req.body.email, req.body.password).then(user => {
// save user information in the session
req.session.user = user;
req.session.authenticated = true;
return res.json({
user:user,
token:token
});
}).catch(err => {
sails.log.error(err);
res.json(403, {
callstack: err.callstack,
error: 'Authentication error',
reason : err.reason
});
});
这是我对其他网页的政策(登录后):
module.exports = function(req, res, next) {
// User is allowed, proceed to the next policy,
if (req.session.authenticated && req.session.user) {
return next();
}
// User is not allowed
return res.forbidden('You are not permitted to perform this action. (Authenticated)');
};
问题是第一次请求没有保存会话数据,这意味着我在第一次成功登录后才获得403 forbidden 。因此,我必须先注销然后再次登录才能显示会话数据。
问题是不仅限于登录(使用身份验证策略),但也适用于需要包含或不包含策略的会话数据的任何操作。并且每个新会话都会发生 - 不仅是服务器第一次启动。
我认为这个问题是由于使用了内存会话所以我还尝试将Sail.js配置为使用Redis作为会话存储,方法是将config / session.js修改为以下内容:
adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: 60*60*20,
// db: 0,
// prefix: 'sess:',
我取消注释了适配器行并尝试使用和不使用可选的redis连接参数,但是req.session在各处声明未定义
答案 0 :(得分:0)
我正在使用connect-mongo适配器并发现了类似的问题。原因是,当您使用req.session.user = user
时,后台代码将会话保存到数据库(在我的情况下,Mongo,在您的Redis中),在之前完成,您的代码将执行{ {1}}部分。
要处理数据库保存的异步代码,请尝试执行以下操作(尚未测试您的代码,但根据我的情况执行此操作,解决了问题):
res.json