Javascript 如何使用passport对用户和管理员进行身份验证

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中运行一个本地策略,我遇到了一个问题,它似乎可以很好地对用户进行身份验证,我可以让该用户在一个会话中在整个站点上持久化,但不能在管理员中持久化。我在MongoDB中分别收集了用户和管理员帐户。我尝试了很多不同的方法,比如为管理员和用户提供不同的护照,为管理员和用户提供不同的数据库,但都没有用。我已经停滞不前了。如果你能给我一个建议,我将不胜感激

//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作为分叉?因此,您不必检查两个模型,只需检查同一模型上的一个字段