在Express 使用session 做登录控制

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){
    // 校验 这里获取的的是get或者post请求过来的参数去做判断
    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");
      }
     
    });
   
};
以下是在dsp项目中看到同事的写法,值得借鉴
//请求接口时,定义请求规则,去调用定义好的过滤参数方法
var reqRule = [];
reqRule.push({'filed': 'type', 'rule': {'notEmpty': '订单类型未传', 'isIn': '订单类型不合法'}, 'option': [1, 2]});
reqRule.push({'filed': 'id', 'rule': {'notEmpty': '订单id未传', 'isInt': '订单id不合法'}});
//dsp中封装过滤参数方法

exports.checkReqRuld = function(req, reqRule){
  var rsMsg = {'code': 0, 'msg':'ok', 'message':'成功', 'childMessages':[], 'data':[]};
  if(reqRule != undefined && reqRule.length>0){
    var i = 0, j = 0, filed = null, rule = null, option = null;
    for (i in reqRule){
      filed = reqRule[i].filed;
      rule = reqRule[i].rule;
      if(reqRule[i].option != undefined){
        option = reqRule[i].option;
      }

      for (j in rule){
        switch(j){
          case 'notEmpty':
            req.assert(filed, rule[j]).notEmpty();
            break;
          case 'isInt':
            req.assert(filed, rule[j]).isInt(option);
            break;
          case 'is_date':
            req.assert(filed, rule[j]).isDate();
            break;
          case 'isIn':
            req.assert(filed, rule[j]).isIn(option);
            break;
          case 'isFloat':
            req.assert(filed, rule[j]).isFloat(option);
            break;
          case 'isJSON':
            req.assert(filed, rule[j]).isJSON();
            break;
        }
      }
    }
    
    var errors = req.validationErrors();
    if(errors && errors.length>0){
      rsMsg.code = -100;
      rsMsg.msg = 'error';
      rsMsg.message = '失败';
      for (var i = 0; i < errors.length; i++) {
        rsMsg.childMessages.push(errors[i].msg);
        break;
      }
    }
  }
  return rsMsg;
}


转载自:http://cnodejs.org/topic/516517a56d38277306c614da
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常是由于没有使用 `express-session` 中间件导致的。`express-session` 是一个 Express 插件,它提供了对会话管理的支持,是使用 Passport 身份验证中间件所必需的。 要解决这个错误,你需要在你的应用程序中添加 `express-session` 中间件。在你的服务器端代码中,你需要以下几步: 1. 安装 `express-session` 模块 ``` npm install express-session --save ``` 2. 在你的应用程序中添加 `express-session` 中间件。例如: ``` const express = require('express'); const session = require('express-session'); const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const app = express(); // 添加 express-session 中间件 app.use(session({ secret: 'your secret key', resave: false, saveUninitialized: false })); // 添加 Passport 中间件 app.use(passport.initialize()); app.use(passport.session()); // 配置本地身份验证策略 passport.use(new LocalStrategy( function(username, password, done) { // 在此处编写验证逻辑 } )); // 序列化和反序列化用户信息 passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); ``` 在上面的例子中,我们首先添加了 `express-session` 中间件,并传入了一个对象作为参数,该对象包含了一些配置选项。其中,`secret` 选项是必需的,它用于加密会话数据。`resave` 和 `saveUninitialized` 选项控制会话的保存行为。接下来,我们添加了 Passport 中间件,并配置了一个本地身份验证策略。最后,我们使用 `passport.serializeUser()` 和 `passport.deserializeUser()` 方法来序列化和反序列化用户信息。 3. 在你的应用程序中使用 Passport 中间件。例如,在登录路由中使用 `passport.authenticate()` 方法: ``` app.post('/login', passport.authenticate('local', { successRedirect: '/dashboard', failureRedirect: '/login' })); ``` 在上面的例子中,我们使用 `passport.authenticate()` 方法来处理登录请求。如果身份验证成功,则将用户重定向到 `/dashboard` 页面;如果身份验证失败,则将用户重定向到 `/login` 页面。 通过添加 `express-session` 中间件,你就可以解决 "Login sessions require session support. Did you forget to use `express-session` middleware?" 这个错误了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值