Mic*_*tas 1 mongoose mongodb node.js express
所以我想比方说 /profile 上的 px 我想知道用户是否使用命令登录!
因此,当他进入主页“/”时,如果他已登录,它将呈现 profile.ejs,或者用于注册和登录的 home.ejs。但我什么时候不会使用 app.get('/登录'...因为当我已经使用配置文件重定向到另一个页面时我再次需要它,但他必须登录才能转到那里。
这是代码:
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' );
Run Code Online (Sandbox Code Playgroud)
Passport已包含登录用户并检查用户是否在任何路由中经过身份验证所需的一切。
您已经正确识别出该req.isAuthenticated()功能是由中间件提供的查看用户当前是否经过身份验证的功能。
用户必须使用 Passport 登录才能使用该功能。在您的app.post('/login'路线中,确保您根据 Passport 对用户进行身份验证,如下所示:
passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
Run Code Online (Sandbox Code Playgroud)
Passport 文档清楚地解释了如果当前配置不起作用,如何设置用户名和密码身份验证。他们给出的示例已经使用 mongoose 从数据库中检索用户。
req.isAuthenticated()然后可以与任何路由中的 if 语句结合使用,根据用户是否登录有条件地执行代码。
if (req.isAuthenticated()) {
// The user is logged in
} else {
// The user is logged out
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建一个简单的中间件,仅在用户登录时才允许访问路由。
function loggedIn(req, res, next) {
if (req.isAuthenticated()) {
next();
} else {
res.redirect('/login');
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
app.get('/protectedRoute', loggedIn, (req, res) => {
// The user is logged in otherwise they would have been redirected
})
Run Code Online (Sandbox Code Playgroud)
请参阅我的 GitHub 存储库,了解完整运行的 Express 和护照登录示例。只需按照自述文件中的说明运行即可。
| 归档时间: |
|
| 查看次数: |
18139 次 |
| 最近记录: |