gpt4 book ai didi

node.js - 如果用户经过身份验证,就阻止他们再次登录 Passportjs?

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

我正在使用 PassportJS,注册和登录功能运行得非常顺利。

我在使用 PassportJS 时遇到的唯一问题(我也在使用 session ),即使用户已经登录,他们也可以再次返回到注册/登录 url 并进行注册和/或重新登录!

这对我来说很有吸引力。如果有人有修复/建议,请把它放下。

更新 - 1

我的routes.js概览:(使用 PassportJS 和 connet-ensure-login。

app.get('*', function(req, res, next) {
if (req.url.indexOf('/users/login') < 0 &&
req.url.indexOf('/users/signup') < 0) {
req.session.returnTo = null;
}
next();
});

// =====================================
// HOME PAGE (with login links) ========
// =====================================
app.get('/', sabSettings, function(req, res) {
Setting.findOne(function(err, setting) {
if (err)
throw err;
// console.log(setting);
res.render('index', { title: 'eduBird | Reach the glory', setting: req.setting }); // load the index file
});
});

// =====================================
// LOGIN ===============================
// =====================================
// show the login form
app.get('/login', sabSettings, function(req, res) {

// render the page and pass in any flash data if it exists
res.render('login', {
message: req.flash('loginMessage'),
errors: req.flash('error'),
title: 'Login | eduBird',
setting: req.setting
});
});

// process the login form

app.post('/login', passport.authenticate('local-login', {
successReturnToOrRedirect: '/loggedin',
failureRedirect: '/login',
failureFlash: true
}));

// =====================================
// SIGNUP ==============================
// =====================================
// show the signup form
app.get('/signup', sabSettings, function(req, res) {

// render the page and pass in any flash data if it exists
process.nextTick(function() {
res.render('signup', {
message: req.flash('signupMessage'),
errors: req.flash('error'),
title: 'Register | eduBird',
setting: req.setting
});
});
});

// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
successReturnToOrRedirect: '/profile/welcome',
failureRedirect: '/signup',
failureFlash: true
}));

最佳答案

您尚未创建任何类型的访问控制,但不用担心,我们将首先了解 Passport 的工作原理并使用它来解决问题。

  1. 当用户提交登录表单时,系统会向我们指定的路径发出 POST 请求,从而执行 Passport.authenticate。
  2. 该路由的身份验证中间件配置为处理本地策略,passport 将调用本地策略的实现。
  3. 如果在与数据库交互时发生错误,我们会调用done(err)。否则,如果找不到用户或密码不匹配,我们将调用done(null, false)。如果成功,我们调用done(null, user)。

调用done将使我们返回到passport.authenticate,并执行相应的重定向。

此时,如果登录成功,用户对象(来自done(null, user))将附加到请求,您可以通过访问用户对象请求用户

主要思想是,如果用户对象未附加到请求,则意味着用户未登录,因此我们可以控制登录的应用程序行为 具有 req.user 的用户。例如:

// If the user object does not exist it means the user is not logged in
if (!req.user) {
res.render('signin');
} else {
// If the user object exists, the user is logged in and if they try to log in we redirect them to the home page
return res.redirect('/');
}

我希望这会有所帮助。

关于node.js - 如果用户经过身份验证,就阻止他们再次登录 Passportjs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42463983/

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