2013-11-22 1 views
1

여권 가이드에서 예제 코드를 구현할 때 가장 최근에 로그인 한 사용자가 다른 모든 것을 "바꿉니다"라는 문제가 발생합니다. 예를 들어 :노드 + 여권 - 여러 사용자

사용자 1의 로그와 사용자 1로 메모를 남긴다 이제 USER1이 메모를 떠날 때
에서
사용자 2 로그, 그것은

은 사용자 세션과 데이터베이스에 저장해야합니까을 user2로 게시 것 connect-mongo와 같은 것 또는 여권은 개별 세션을 추적합니까? API 호출이 어떤 사용자가 만들 었는지에 관계없이 항상 가장 최근 사용자의 req.user를받는 것처럼 보입니다.

비슷한 질문에 serializer에 문제가있었습니다. 내 문제가 어디에 놓여 있는지 확신 할 수 없으므로 그냥 게시 할 것입니다.

// Express setup 
var http = require('http'); 
var express = require('express'); 
var app = express(); 
var signedIn = false; 


// Mongoose setup 
var mongoose = require('mongoose'); 
mongoose.connect(''); 

var UserSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

var NoteSchema = mongoose.Schema({ 
    text: String, 
    user: String 
}); 

// Used for password authorization 
UserSchema.methods.validPassword = function (pwd) { 
    return (this.password === pwd); 
}; 

var Users = mongoose.model('Users', UserSchema); 
var Notes = mongoose.model('Notes', NoteSchema); 


// Passport setup 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 


// Passport Serialize 
passport.serializeUser(function (user, done) { 
    done (null, user.id); 
}); 

passport.deserializeUser(function (id, done) { 
    Users.findById(id, function (err, user) { 
     done (err, user); 
    }); 
}); 

// Use Local Strategy 
passport.use(new LocalStrategy(
    function(username, password, done) { 
     Users.findOne({ username: username }, function (err, user) { 
      if (err) { 
       return done(err); } 
      if (!user) { 
       return done(null, false, {message: 'Incorrect username' }); 
      } 
      if (!user.validPassword(password)) { 
       return done(null, false, { message: 'Incorrect password' }); 
      } 
      console.log(user.username + " is signed in"); 
      return done(null, user); 
     }); 
     } 
    )); 

// App configuration 

app.configure(function() { 

    app.set('port', process.env.PORT || 5000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 

    app.use(express.static(__dirname + '/public')); 

    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 

    app.use(express.session({ secret: 'keyboard cat' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
}) 


// Passport Authentication 
app.post('/login', 
    passport.authenticate('local', { successRedirect: '/notes', 
            failureRedirect: '/login', 
            /*failureFlash: true*/ }) 
); 

// API 
// Notes 
app.get('/api/notes', function (req, res) { 
    Notes.find({}, function (err, note) { 
     if (err) { 
      res.send(err); 
     } 

     res.json(note); 
    }) 
}) 

app.post('/api/notes', function (req, res) { 
    Notes.create({ 
     text : req.body.text, 
     user : req.user.username, 
     done : false 

    }, function (err, note) { 
     if (err) { 
      res.send(err); 
     } 

     Notes.find(function (err, note) { 
      if (err) { 
       res.send(err); 
      } 

      res.json(note); 
     }) 
    }) 
}) 

app.delete('/api/notes/:note_id', function (req, res) { 
    Notes.remove({ _id : req.params.note_id }, 
     function (err, req) { 
      if (err) { 
       res.send(err); 
      } 

     Notes.find(function (err, note) { 
      if (err) { 
       res.send(err); 
      } 

      res.json(note); 
     }); 
    }); 
}); 

// Users 
// Create New User 
app.post('/api/users', function (req, res, next) { 
    Users.create({ 
     username : req.body.username, 
     password : req.body.password, 
     done : false 
    }, function (err, user) { 
     if (err) { 
      res.send(err); 
     } else { 
      res.redirect('/login'); 
     } 
    }); 
}); 


// Routes 

app.get('/', function (req, res) { 
    res.render('login'); 
}); 

app.get('/login', function (req, res) { 
    res.render('login'); 
}) 

app.get('/newuser', function (req, res) { 
    res.render('newuser'); 
}) 

app.get('/notes', function (req, res) { 
    if (req.user != null) { 
     console.log(req.user); 
     res.render('index', { 'userName' : req.user.username }); 
    } else { 
     res.send("Not signed in!") 
    } 
}); 

// HTTP Server 

http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on: " + app.get('port')); 
}) 

답변

2
이 발생할 수있는 이유는 몇 가지 이유를 생각할 수

:

  • 당신이 (실수로) 당신의 의심스러운 찾고 signedIn 변수와 같은 상태 정보의 형태를 유지하기 위해 전역 변수를 만들 때 (당신 돈 그래도 게시 된 코드에서 그렇게하는 것처럼 보입니다.);
  • app.locals을 사용하고 있습니다. 여기에는 res.locals을 사용하려고했으나 (아직 수행하지는 않았지만 언급할만한 가치가 있음);
  • 동일한 브라우저의 다른 탭/창에서 두 번째 사용자로 로그인하고 있습니다. 세션이 탭/창에서 공유되므로 한 탭에서 UserA으로 로그인 한 다음 다른 세션에서 UserB으로 로그인하면 UserB 세션에 의해 세션이 덮어 쓰기 전에 더 이상 UserA의 작업을 수행 할 수 없습니다. 다른 브라우저에서 UserB으로 로그인하십시오.
+0

(두 개의 탭 대신) 다른 브라우저를 사용해 보지 않고 너무 오래 동안 보냈습니다. 그거였다! : D – Daniel

+0

내가 실수하지 않는다면 크롬을 사용하는 경우 여러 개의 시크릿 창을 사용하여 세션을 분리 할 수 ​​있습니다. –

+0

@NickMitchinson 세션을 다른 시크릿 창과 탭에서 공유하는 것처럼 보였습니다. ( – robertklep