gpt4 book ai didi

node.js - 在 PassportJS 中使用多种本地策略

转载 作者:IT老高 更新时间:2023-10-28 21:57:44 26 4
gpt4 key购买 nike

我正在尝试对 PassportJS 使用多种 LOCAL 策略。我不想使用本地、facebook 和 gmail 等。我有两组用户存储在不同的对象中,我想使用本地策略对两者进行身份验证。就目前而言,我不能对两者使用相同的本地策略,因为它们具有不同的对象属性,这让我查询不同的对象。有没有办法做到这一点?或对此提出任何建议将不胜感激。

最佳答案

您可以命名您的本地策略以将它们分开。

// use two LocalStrategies, registered under user and sponsor names

// add other strategies for more authentication flexibility
passport.use('user-local', new LocalStrategy({
usernameField: 'email',
passwordField: 'password' // this is the virtual field on the model
},
function(email, password, done) {
User.findOne({
email: email
}, function(err, user) {
if (err) return done(err);

if (!user) {
return done(null, false, {
message: 'This email is not registered.'
});
}
if (!user.authenticate(password)) {
return done(null, false, {
message: 'This password is not correct.'
});
}
return done(null, user);
});
}
));

// add other strategies for more authentication flexibility
passport.use('sponsor-local', new LocalStrategy({
usernameField: 'username',
passwordField: 'password' // this is the virtual field on the model
},
function(username, password, done) {
Sponsor.findOne({
'primaryContact.username': username
}, function(err, sponsor) {
if (err) return done(err);

if (!sponsor) {
return done(null, false, {
message: 'This email/username is not registered.'
});
}
if (!sponsor.authenticate(password)) {
return done(null, false, {
message: 'This password is not correct.'
});
}
return done(null, sponsor);
});
}
));

后来的 Controller 代码通过名称引用它们。

/**
* User Login
*/
exports.loginUser = function (req, res, next) {
passport.authenticate('user-local', function(err, user, info) {
var error = err || info;
if (error) return res.json(401, error);

req.logIn(user, function(err) {

if (err) return res.send(err);
res.json(req.user.userInfo);
});
})(req, res, next);
};

/**
* Sponsor Login
*/
exports.loginSponsor = function (req, res, next) {
passport.authenticate('sponsor-local', function(err, sponsor, info) {
var error = err || info;
if (error) return res.json(401, error);

req.logIn(sponsor, function(err) {
if (err) return res.send(err);
res.json(req.sponsor.profile);
});
})(req, res, next);
};

稍后当需要序列化您的用户时,您可能想要执行类似的操作。

// serialize
passport.serializeUser(function(user, done) {
if (isUser(user)) {
// serialize user
} else if (isSponsor(user)) {
// serialize company
}
});

关于node.js - 在 PassportJS 中使用多种本地策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20052617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com