gpt4 book ai didi

node.js - Node + Passport - 多个用户

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:45 25 4
gpt4 key购买 nike

当尝试实现 Passport 指南中的示例代码时,我遇到了一个问题,即最近登录的用户“替换”了所有其他用户。例如:

user1 以 user1 身份登录并留下注释
user2 登录
现在,当 user1 留下注释时,它会以 user2 的身份发布

用户 session 是否需要使用 connect-mongo 之类的东西存储在数据库中,或者 Passport 是否跟踪各个 session ?看起来 API 调用总是获取最新用户的 req.user,无论是哪个用户创建的。

类似的问题有序列化器的问题。我不确定我的问题出在哪里,所以我将其全部发布。

// 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'));
})

最佳答案

我可以想到可能发生这种情况的几个原因:

  • 当您(错误地)创建一个全局变量来保存某种形式的状态信息时,例如您看起来可疑的 signedIn 变量(尽管您似乎没有在发布的代码中这样做);
  • 在您打算使用 res.locals 的地方使用 app.locals (您也没有这样做,但仍然值得一提);
  • 您正在以第二个用户身份从同一浏览器的不同选项卡/窗口登录; session 在选项卡/窗口之间共享,因此当您从一个选项卡以 UserA 身份登录,然后从另一个选项卡以 UserB 身份登录时,在该 session 被 UserB session 覆盖之前,您将无法再以 UserA 身份执行操作;尝试从不同的浏览器以 UserB 身份登录;

关于node.js - Node + Passport - 多个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com