javascript - 多重身份验证不起作用 passport.js
问题描述
我正在尝试通过多种策略对多个用户进行身份验证。我有 2 个表,第一个是用户表,第二个是员工,但是当我尝试登录时它正在工作,它显示错误
User not exist
当我只使用单一身份验证策略时,它可以工作,但是当我使用多种策略时,它会显示错误
Auth.js
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')
const User = require('../models/authUserModel')
const Employee = require('../models/employeeModel')
module.exports = function (passport) {
passport.use("user-local",
new LocalStrategy({usernameField: "email"}, function (email, password, done) {
User.findOne({email: email})
.then(user => {
if (!user) {
return done(null, false, ({message: 'Email not exist'}))
}
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err
if (isMatch) {
return done(null, user)
} else {
return done(null, false, ({message: 'Password incorrect'}))
}
})
}).catch(err => console.log(err))
})
)
passport.use('local',
new LocalStrategy({usernameField:"email"}, function (email, password, done){
Employee.findOne({email:"email"})
.then(user=>{
if(!user){
return done(null, false,'employee not exist')
}
bcrypt.compare(password, user.password, (err, isMatch)=>{
if(isMatch){
return done(null, user)
}
else {
return done(null, false, 'password or email is incorrect')
}
})
}).catch(err=>console.log(err))
})
)
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
}
登录.js
let express = require('express');
let router = express.Router();
const passport = require('passport')
router.get('/login', function(req, res, next) {
res.render('login');
})
router.post('/login', function (req, res, next) {
passport.authenticate("user-local", function (err, user, info) {
if (err) {
return next(err)
}
if (!user) {
console.log('User not exist')
return res.render('login')
}
req.logIn(user, function (err) {
if (err) {
return next(err)
}
req.session.isLoggedIn = true
req.session.user = user
req.session.save(err => {
console.log(err)
if (req.isAuthenticated()) {
return res.redirect('/customerMenu')
}
console.log('user not exist')
return res.render('login')
})
})
})(req, res, next)
passport.authenticate('local', function (err, user, info){
if(err){
return next(err)
}
if(!user)
{
console.log("employee not exist")
return res.render('login')
}
req.logIn(user,function (err){
if(err){return next(err)}
req.session.isLoggedIn = true
req.session.user = user
req.session.save(err=>{
console.log(err)
if (req.isAuthenticated()) {
return res.redirect(200,'/employeeMenu')
}
console.log('user not exist')
return res.render('login')
})
})
})(req, res, next)
})
function isLoggedIn(req, res, next){
if(req.isAuthenticated()){
req.isLogged = true
return next();
}
else{
req.isLogged = false
return next()
}
}
module.exports = isLoggedIn
module.exports = router
解决方案
我认为您需要编辑您的.serializeUser()
和.deserializeUser()
功能,以便护照知道您尝试序列化和反序列化的用户类型。
我过去的做法是使用 SessionConstructor 将用户的 id 和他们所在的用户类型放在一个对象中。然后,您可以在反序列化函数中使用它来确定您尝试登录的用户类型。
function SessionConstructor(userId, userGroup){
this.userId = userId;
this.userGroup = userGroup;
}
passport.serializeUser((user, done) => {
let userGroup = 'user';
if (//condition to tell if it is the other user type){
userGroup = 'employee';
};
let sessionConstructor = new SessionConstructor(user.id, userGroup)
done(null, sessionConstructor);
});
passport.deserializeUser((sessionConstructor, done) => {
if (sessionConstructor.userGroup == 'user'){
User.findById(sessionConstructor.userId).then(user => done(null, user));
} else if (sessionConstructor.userGroup == 'employee'){
Employee.findById(sessionConstructor.userId).then( employee=> done(null, employee));
}
});
但是,您需要考虑其中的 if 语句的条件.serializeUser()
,它将告诉您它是哪种类型的用户。如果您在发送到的用户对象中包含一个唯一标识符.serializeUser()
,那么您可以检查它来判断。例如,在您的用户对象中有一个名为employee 的键,true
如果是员工提交它,则该键的值是,false
否则。如果你选择这个实现,它看起来像这样。
passport.serializeUser((user, done) => {
let userGroup = 'user';
if (user.employee){
userGroup = 'employee';
};
let sessionConstructor = new SessionConstructor(user.id, userGroup)
done(null, sessionConstructor);
});
除此之外,我认为下面的代码应该可以工作,但是请随时询问有关此方法的任何问题,我会尽力回答!
推荐阅读
- android - Firebase Crashlytics 是否可以获取我的应用程序数据?
- python - 有没有办法让 UNIX 帮助利用 GPU 使用来执行 python
- ruby-on-rails - 如何使用另一个助手的助手?
- angular-ui-router - 我无法在 Angular 组件类中注入路由器
- python - 如何使用 Pandas 扩展带有日期的行
- javascript - 如何使用 javascript json 保存语言
- kotlinx-html - 如何将 kotlinx.html 小部件转换为字符串?
- javascript - 如何在javascript中设置环境变量
- python - 如何从python中的多个键中获取值
- arrays - Laravel 访问常量和 in 常量