Hello guy是我在节点js中的新手我为多个用户创建了一个具有特定权限的演示应用程序。我的问题是当一个用户登录系统工作正常,但当其他用户在系统中登录同一服务器上的另一台计算机时,它会覆盖第一个用户权限。我不知道如何解决这个问题,我搜索谷歌和stackoverflow也没有什么请帮助我。 下面是我的登录和会话管理代码
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
//app setup
var app = express();
//cookie parser
app.use(cookieParser());
//session
app.use(session({secret: '1234567890QWERTY',cookieName: 'session' }));
app.post('/users/loginAuthentication', function(req, res) {
var query = req.body;
var conditions = {email: query.username, password: query.password.toString(), is_delete: false, status: true};
userModel.findOne(conditions, function(err, admins) {
if (err) {
console.log(err.message);
} else {
if (!admins) {
res.end('{"success" : "not login", "status" : 400, "Auth" : "Failed"}');
} else {
req.session.admin = admins;
app.locals.checkAuth = req.session.admin.user_roles;
app.locals.USERNAME = req.session.admin.user_name;
res.end('{"success" : "Updated Successfully", "status" : 200, "Auth" : "Success"}');
}
}
});
});
获取权限我在我的jade文件中做了类似的事情
if (checkAuth == 'ADMIN')
li
a(href='/data')
i.fa.fa-plus-square-o.fa-fw
| table data
答案 0 :(得分:2)
问题发生的原因是您在app.locals中存储数据,这些数据在应用程序的整个生命周期中都会持续存在。
看看以下几行:
app.locals.checkAuth = req.session.admin.user_roles;
app.locals.USERNAME = req.session.admin.user_name;
属性" checkAuth"和" USERNAME"将在那里停止您的应用程序(例如Ctrl + C)。
为了解决问题,您应该将这些属性存储在res.locals而不是app.locals中;
接下来的问题是如何传递它们来查看Jade?您可以尝试以下脚本(未测试!):
app.use(function(req, res, next){
var render = res.render;
var resLocals = res.locals;
res.render = function(view, locals, cb){
locals.checkAuth = resLocals.checkAuth;
locals.USERNAME = resLocals.USERNAME;
render.call(res, view, locals, cb);
}
next();
});
以上块作为常规ExpressJS中间件,在执行模板引擎行为之前将数据从res.locals复制到app.locals。
*增加:
会话数据应在请求 - 响应周期内的控制器中处理。在现实世界中,你应该做这样的事情:
// homeController.js
function index(req, res){
var data = {
checkAuth: req.session.user_roles;
USERNAME: req.session.user_name;
}
res.render('yourJadeTemplateFile', data);
}