Javascript 如何使用passport对用户和管理员进行身份验证
我在passport中运行一个本地策略,我遇到了一个问题,它似乎可以很好地对用户进行身份验证,我可以让该用户在一个会话中在整个站点上持久化,但不能在管理员中持久化。我在MongoDB中分别收集了用户和管理员帐户。我尝试了很多不同的方法,比如为管理员和用户提供不同的护照,为管理员和用户提供不同的数据库,但都没有用。我已经停滞不前了。如果你能给我一个建议,我将不胜感激Javascript 如何使用passport对用户和管理员进行身份验证,javascript,node.js,mongodb,mongoose,passport.js,Javascript,Node.js,Mongodb,Mongoose,Passport.js,我在passport中运行一个本地策略,我遇到了一个问题,它似乎可以很好地对用户进行身份验证,我可以让该用户在一个会话中在整个站点上持久化,但不能在管理员中持久化。我在MongoDB中分别收集了用户和管理员帐户。我尝试了很多不同的方法,比如为管理员和用户提供不同的护照,为管理员和用户提供不同的数据库,但都没有用。我已经停滞不前了。如果你能给我一个建议,我将不胜感激 //Passport.js const LocalStrategy = require('passport-local').Stra
//Passport.js
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose')
const bcrypt = require('bcrypt')
// Loads in user model
const User = require('../models/userModel')
//Loads in the admin model
const Admin = require('../models/adminModel')
module.exports = function (authUser){
authUser.use(
'authUser',new LocalStrategy({usernameField: 'username'}, (username, password, done)=>{
//Match user
const user = User.findOne({username: username})
.then(user=>{
if(!user){
return done(null, false, {message: 'Incorrect Username'})
}
//Match password
bcrypt.compare(password, user.password, (err, isMatch)=>{
if(err) throw err;
if (isMatch) {
return done(null, user)
}else {
return done(null, false, {message: 'Incorrect password'})
}
})
})
.catch(err=>console.log(err));
})
)
authUser.serializeUser((user, done) =>{
done(null, user.id);
});
authUser.deserializeUser((id, done) =>{
User.findById(id, (err, user) => {
done(err, user);
});
});
authUser.use(
'admin',new LocalStrategy({usernameField: 'username'}, (username, password, done)=>{
//Match user
const admin = Admin.findOne({username: username})
.then(admin=>{
if(!admin){
return done(null, false, {message: 'Incorrect Username'})
}
//Match password
bcrypt.compare(password, admin.password, (err, isMatch)=>{
if(err) throw err;
if (isMatch) {
return done(null, admin)
}else {
return done(null, false, {message: 'Incorrect password'})
}
})
})
.catch(err=>console.log(err));
})
)
authUser.serializeUser((admin, done) =>{
done(null, admin.id);
});
authUser.deserializeUser((id, done) =>{
Admin.findById(id, (err, admin) => {
done(err, admin);
});
});
}
//Authenticate.js
module.exports = {
checkAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return next()
}
// req.flash('error_msg', 'please login to view this resource')
res.redirect('/Users/Login')
},
checkNotAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return res.redirect('/')
}
// req.flash('error_msg', 'please login to view this resource')
return next()
},
checkAdminAuthenticated: function(req, res, next) {
if (req.isAuthenticated()) {
return next()
}
// req.flash('error_msg', 'please login to view this resource')
res.redirect('http://localhost:3000/Admin/SignIn')
}
}
//Snippet from adminRoute.js
const passport = require('passport')
require('../config/passport.js')(passport)
app.get("/SignIn", checkNotAuthenticated,(req,res) =>{
res.render("adminLogin.ejs")
})
app.get('/Orders', checkAdminAuthenticated, (req, res) => {
Request.find({}).then(results => {
res.render('orders.ejs', {
Orders: results
});
})
})
// Login Handle
app.post('/SignIn', checkNotAuthenticated, (req,res, next)=>{
passport.authenticate('admin',{
successRedirect: '/AdminPage', //On success redirect to home
failureRedirect: '/Admin/SignIn', //On failure redirect back to login page
session: true,
failureFlash: true
})(req,res,next);
})
module.exports = app
//Snippet from userRoute.js
const passport = require('passport')
const authUser = new passport.Passport();
require('../config/passport.js')(authUser)
// DB config
const userDB = require('../config/keys').MongoURI
const User = require('../models/userModel')
app.get("/Login", checkNotAuthenticated,(req,res) =>{
res.render("login.ejs")
})
app.delete('/logout', (req, res) => {
req.logOut()
res.redirect('/Users/Login')
})
app.get('/Register', checkNotAuthenticated, (req,res)=>{
res.render("register.ejs")
})
// Login Handle
app.post('/Login', checkNotAuthenticated,(req,res, next)=>{
authUser.authenticate('authUser',{
successRedirect: '/', //On success redirect to home
failureRedirect: '/Users/Login', //On failure redirect back to login page
session: true,
failureFlash:true
})(req,res,next);
})
module.exports = app
// snippet from app.js
const passport = require('passport')
const authUser = new passport.Passport();
require('./config/passport.js')(authUser)
app.use(authUser.initialize())
app.use(authUser.session())
app.use('/Users', require('./routes/userRoute'))
app.use('/Admin', require('./routes/adminRoute'))
您不需要使用两种LocalStrategy,您可以对user和adminHi Sven.hig使用一种,我感谢您的快速响应。不过我有点困惑,passport如何知道在mongoDB中使用哪个集合?为什么不只使用一个模型和一个字段,比如type=user或type=admin作为分叉?因此,您不必检查两个模型,只需检查同一模型上的一个字段。您不需要使用两个localstrategies。您可以对user和adminHi Sven使用一个。hig,我感谢您的快速响应。不过我有点困惑,passport如何知道在mongoDB中使用哪个集合?为什么不只使用一个模型和一个字段,比如type=user或type=admin作为分叉?因此,您不必检查两个模型,只需检查同一模型上的一个字段