2016-09-28 61 views
0

我有兩個模型用戶和管理員。他們都有自己的路線文件users.js和admins.js以及他們自己的本地策略。用戶使用電子郵件進行認證,而管理員使用用戶名所以他們都有自己的「passport.use」,但是當用戶使用'/ login'後,它會以某種方式調用管理員的「passport.use」。我不知道爲什麼。 這裏是users.js代碼: -與本地策略護照在兩個單獨文件中衝突

var express = require('express'); 
var router = express.Router(); 
var bodyParser=require('body-parser'); 
var User=require('../models/user'); 
var passport=require('passport'); 
var localStrategy=require('passport-local').Strategy; 

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!user) { 
     return res.send('User not found'); 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.json(user); 
    }); 
    })(req, res, next); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

//this doesnt seem to work..doesnt call this one 
passport.use(new localStrategy({usernameField:'email', passwordField:'password'},function(email,password,done){ 
    User.getUserByUsername(email, function(err,user){ 
     if(err) throw err; 
     if(!user){ 
     return done(null,false,{message: 'User not found'}); 
     } 

     User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, user); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

這是admins.js代碼: -

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, admin, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!admin) { 
     return res.send('Admin not found'); 
    } 
    req.logIn(admin, function(err) { 
     if (err) { return next(err); } 
     return res.json(admin); 
    }); 
    })(req, res, next); 
}); 

//for sessions 
passport.serializeUser(function(admin, done) { 
    done(null, admin.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    Admin.getAdminById(id, function(err, admin) { 
    done(err, admin); 
    }); 
}); 
    //this gets called even when im calling /users/login 
    passport.use(new localStrategy(function(username,password,done){ 
    Admin.getAdminByUsername(username, function(err,admin){ 
     if(err) throw err; 
     if(!admin){ 
     return done(null,false,{message: 'Admin not found'}); 
     } 

     Admin.comparePassword(password, admin.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, admin); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

注意,這兩個文件都在根據路線同一水平folder..and其模型文件再次位於同一級別的模型文件夾中。管理員完美工作,但用戶身份驗證沒有發生。

回答

1

問題是passport.use()將用作描述策略的邏輯名作爲可選的第一個參數。每個策略算法都提供其自己的默認名稱。當您執行身份驗證時,護照框架將根據該名稱選擇策略。因此,在你的情況下,最後一次註冊local名稱(本地策略的默認名稱),你正在獲取爲該名稱註冊的最後一個算法。

的溶液將是上users.js代碼執行以下修改:

var User=require('../models/user'); 
var passport=require('passport'); 
var localStrategy=require('passport-local').Strategy; 

router.post('/login', function(req, res, next) { 
    passport.authenticate('local-users', function(err, user, info) { 
    if (err) { 
     return next(err); 
    } 
    if (!user) { 
     return res.send('User not found'); 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.json(user); 
    }); 
    })(req, res, next); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

//for sessions 
passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

//this doesnt seem to work..doesnt call this one 
passport.use('local-users', new localStrategy({usernameField:'email', passwordField:'password'},function(email,password,done){ 
    User.getUserByUsername(email, function(err,user){ 
     if(err) throw err; 
     if(!user){ 
     return done(null,false,{message: 'User not found'}); 
     } 

     User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
      return done(null, user); 
     } 
     else{ 
      return done(null,false,{message: 'Password doesnt match our records'}); 
     } 
     }); 
    }); 

    })); 

正如你可以看到,我們的LocalStrategy上的用戶模塊的上下文中提供的替代策略名稱。我們正在使用該策略(在passport.authenticate調用)使用這個特定的策略名稱。

+0

非常感謝好友。無法在文檔中找到這個東西,或者我錯過了它。奇蹟般有效。你已經救了我的一天 –