尝试检查是否存在具有相同session.username的另一个会话

时间:2016-08-25 17:17:02

标签: node.js

我目前正在练习nodeJS,我想实现这样的目标:

我正在尝试检查是否存在具有相同session.username的另一个会话。如果是,则显示警告。我是这样做的:

app.post('/login', (req, res) => {
  let options = {"username": req.body.username, "error": null};
  if(!req.body.username) {
    options.error = "username required nobi";
    res.render('login', options);
  } else if (req.body.username == req.session.username) {
    res.redirect('/');
  } else {
    req.sessionStore.all( (err, sessions) => {
      if(!err) {
        let isUsed = false;
        let i=0;
        for(i; i < sessions.length; i++) {
          let session = JSON.parse(sessions[i]);
          if (session.username == req.body.username) {
            err = "name already taken";
            isUsed = true;
            break;
          }
        }
      }
      if (err) {
        options.error = err;
        res.render('login', options);
      } else {
        req.session.username = req.body.username;
        res.redirect("/");
      }
    });
  }
});

它不起作用:我使用相同的用户名在chrome和IE上连接。我不希望那是可能的

作为说明(如果需要):

{ If9a9SgOoq7roW8Za84CouSEzgqDs1Q3:
   { cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
     username: 'pseudo' },
  MBs41iJmoQpLLCDhP8aFAk5PWAZ_ZQSV:
   { cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
     username: 'pseudo' } }

1 个答案:

答案 0 :(得分:0)

app.post('/login', (req, res) => {
    // You can store username in res.locals.username after auth
    // It's not necessary to pass it into render.

    let username = req.body.username;
    if(!username) 
        return res.render('login', {error: 'username required nobi'});

    if (username == req.session.username) 
        return res.redirect('/');

    if (username && username != req.session.username)   
        return ... // maybe destroy current session?

    req.sessionStore.all( (err, sessions) => {
        if (err) 
            return res.render('login', {error: err.message});

        let isUsed = Object.keys(sessions).some((id) => sessions[id].username == username);
        if (isUsed)
            return res.render('login', {error: 'Already used'});

        req.session.username = username;
        res.locals.username = username;
        res.redirect('/');
    });
});