首页 > 解决方案 > 如何检查用户是否使用 node.js 和 mongoose 登录

问题描述

所以我想在 /profile 上说 px 我想知道用户是否使用命令登录!

因此,当他转到主页“/”时,如果他已登录,它将呈现 profile.ejs 或 home.ejs 以注册和登录。但我不使用 app.get('/ login'...因为当我已经使用配置文件重定向到另一个页面但他必须登录才能去那里时,我再次需要它。

这是代码:

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config()
}

const express = require('express')
const app = express()
const bcrypt = require('bcrypt')
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const methodOverride = require('method-override')
const initializePassport = require('./passport-config')
var mongodb = require('mongodb');
const bodyParser = require('body-parser');
initializePassport(
  passport,
  email => users.find(user => user.email === email),
  id => users.find(user => user.id === id)
)

var urlencodedParser = bodyParser.urlencoded({extended:false})
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
const users = []

var http = require('http');

/* ************ */
app.use(express.static(__dirname + '/public'));
app.set('view-engine', 'ejs')
app.use(express.urlencoded({ extended: false }))
app.use(flash())
app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
app.use(methodOverride('_method'))


app.use( bodyParser.json() );     

var dbConn = mongodb.MongoClient.connect('mongodb://localhost:27017/');

var path = require('path');

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/nyg', {useNewUrlParser: true});
const Schema = mongoose.Schema;

const userSchema = new Schema({
  email: String,
  password: String
});

const User = mongoose.model('users', userSchema);

app.post('/register', async (req, res, next) => {
  const user = await User.findOne({
    email: req.body.email,
    password: req.body.password
  }).exec();

  if (user) {
    res.redirect('/register');
    next();
  }

  else new User({
    email: req.body.email,
    password: req.body.password
  })
    .save()
    .exec();
  res.redirect('/login');
  next();
});

app.post('/login', async (req, res, next) => {
  const user = await User.findOne({
    email: req.body.email,
    password: req.body.password
  });
  if (user) res.redirect('/');
  else res.redirect('/login');
  next();
});


app.get('/', (req, res) => {
  if (req.isAuthenticated()) res.render('profile.ejs')

  else res.render('index.ejs')
})

app.get('/login', (req, res) => {
  res.render('login.ejs')
})


app.get('/register', (req, res) => {
  res.render('register.ejs')
})


app.delete('/logout', (req, res) => {
  req.logOut()
  res.redirect('/login')
})



app.listen(process.env.PORT || 3000, process.env.IP || '0.0.0.0' );

标签: node.jsmongodbexpressmongoose

解决方案


Passport已经包含了登录用户并检查用户是否在任何路由中经过身份验证所需的一切。

您已正确识别出该req.isAuthenticated()功能是由中间件提供的,用于查看用户当前是否经过身份验证。

用户必须使用 Passport 登录才能使用该功能。在您的app.post('/login'路线中,请确保您针对 Passport 对用户进行身份验证,如下所示:

passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

Passport 文档清楚地解释了如果您当前的配置不起作用,如何设置它以进行用户名和密码身份验证。他们给出的示例已经使用猫鼬从数据库中检索用户。

req.isAuthenticated()然后可以与来自任何路由的 if 语句结合使用,以根据用户是否登录有条件地执行代码。

if (req.isAuthenticated()) {
  // The user is logged in
} else {
  // The user is logged out
}

或者,您可以创建一个简单的中间件,仅在用户登录时才允许访问路由。

function loggedIn(req, res, next) {
  if (req.isAuthenticated()) {
    next();
  } else {
    res.redirect('/login');
  }
}

像这样使用它:

app.get('/protectedRoute', loggedIn, (req, res) => {
  // The user is logged in otherwise they would have been redirected
})

请参阅我的 GitHub 存储库以获取完整的快速和护照登录示例。只需按照自述文件中的说明运行它。


推荐阅读