在Express 使用session 做登录控制
var filter = require('./lib/filter');
filter中判断是否已经登录如果登录了则过去,否则跳转到登录页
exports.authorize = function(req, res, next) {
if (!req.session.user_id) {
res.redirect('/admin/login');
} else {
next();
}
}
在configure中使用session
app.use(express.cookieParser('sctalk admin manager'));
app.use(express.session());
路由控制,在需要登录验证的路由上加上filter.authorize
app.get('/admin/login',admin.login);
app.get('/admin/logout',admin.logout);
app.get('/admin/:action',filter.authorize, function(req, res, next){
if(admin[req.params.action])
{
admin[req.params.action](req, res, next);
}
else
{
res.status(404);
res.end();
}
});
最后在登录判断时候添加session即可
exports.dologin = function(req, res,next){
// 校验
req.assert('username', "用户名不能为空").notEmpty();
req.assert('password', "密码不能为空").notEmpty();
var errors = req.validationErrors();
if(errors && errors.length>0)
{
var ermsg = [];
for(var i=0;i<errors.length;i++)
{
ermsg.push(errors[i].msg);
}
var json={title:'管理后台-- 请先登录',error:ermsg.join("\n")};
res.render('admin/login', json);
return;
}
var userid = req.body.username;
var pwd = req.body.password;
var ip = req.ip;
userbiz.checkUser(userid,pwd,ip,function(err,user){
if(!!err){
var json={title:'管理后台-- 请先登录',error:err};
res.render('admin/login', json);
}
else{
req.session.user_id = user.user_id;
req.session.user = user;
res.redirect("/admin/index");
}
});
};
9 回复
+1
怎么没有logout呢?
@lonso 额。。。 应该是 req.session.destroy() 吧
学习
express 4.x不适用了,d:(
没用过express 也没研究过他的那些中间件, 只是想问下express 的 session 是保存在内存中每次请求来去根据sessionID去取数据的么
不灌水会死么楼主,换个头像我就不认识你了?
@Hi-Rube 不一定,session存数据库的还多一些 cnode社区的session中间件
var session = require('express-session');
app.use(session({
secret: config.session_secret,
key: 'sid',
store: new MongoStore({
db: config.db_name
}),
resave: true,
saveUninitialized: true,
}));
store用的是MongoDB
@backsapce 学习了~ 估计要看不同场景吧 选择redis