在Express 使用session 做登录控制
发布于 12 年前 作者 xuanye 75325 次浏览 最后一次编辑是 8 年前
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 回复

怎么没有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

回到顶部