node.js - 如何检查用户是否使用 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' );
解决方案
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 存储库以获取完整的快速和护照登录示例。只需按照自述文件中的说明运行它。
推荐阅读
- javascript - 如何使用 Mongo DB 中的反应钩子形式将默认值更新为更新数据
- javascript - 如何部署使用 express.js 和 puppeteer 的应用程序?(有点像 REST API)
- c - 我将如何为我的语言添加定义?
- autohotkey - 避免热键的重叠修饰符
- c++ - 详情滚动区的setwidget函数显示一个工具栏
- android - 使用 MPChart 在 X 轴上显示时间的图表
- node.js - 在不泄露凭据的情况下保护 Web 应用不受授权 API 的影响
- flutter - 颤振自动路由构建运行器错误路由必须具有页面或重定向目标
- angular - Ngb 日期选择器禁用日历 Angular 中的特定日期
- google-cloud-functions - 在履行代码中使用 Enable beta features and APIs 选项和 agent.setFollowupEvent() 时聊天机器人中断