2017-04-06 82 views
0

我正在用護照進行用戶認證。首先我創建了一個默認管理員用戶。現在,此管理員必須能夠創建用戶,但不能創建任何其他用戶。爲此,我在數據庫中創建了一個Admin用戶。現在我的問題是如何通過管理員創建其他用戶,以及只有這個管理員應該有權訪問所有API的路由,但不能爲任何其他用戶如何保護API的?在server.js文件,我創建的中間件功能用Node.js進行用戶認證

//Catch unauthorized errors 
app.use(function (err, req, res, next) { 
    if(err.name === 'UnauthorizedError') { 
     res.status(401); 
     res.json({"message": err.name + ":" + err.message}); 
    } 
}); 

請這方面的幫助。我希望你們不介意張貼這麼長的文件。

'authentication.js'

'use strict'; 
var passport = require('passport'), 
    mongoose = require('mongoose'), 
    Users = mongoose.model('Users'); 


var authentication = { 

    register: function(req, res, name, email, password) { 
     var userData = req.body; 

     var user = new Users({ 
      email: userData.email, 
      name: userData.name, 
     }); 

     user.setPassword(userData.password); 

     if(!user) { 
      res.status(400).send({error: 'All fields required'}); 
     } 

     user.save(function(err, result) { 
      if(err) { 
       console.log('Could not save the User'); 
       res.status(500).send({error: 'Could not save the User'}); 
      }else { 
       res.send('New User Created Successfully'); 
      } 
     }); 
    }, 

    login: function (req, res) { 
     if(!req.body.email || !req.body.password) { 
      res.status(400).send({"message": "All fields required"}); 
      return;  
     } 

     passport.authenticate('local', function (err, user, info) { 
      var token; 

      if (err) { 
     res.status(404).send({err: 'An Error Occured'}); 
       return; 
      } 

      if(user) { 
       token = user.generateJwt(); 
     res.status(300).send({"token": token}); 
      }else { 
     res.status(401).send('Unauthorized User'); 
      } 
     }); 
    } 

}; 

module.exports = authentication; 

'用戶model.js'

'use strict'; 
var mongoose = require('mongoose'), 
    crypto = require('crypto'), 
    jwt = require('jsonwebtoken'), 
    Schema = mongoose.Schema; 

var userSchema = new mongoose.Schema({ 
    email: { 
     type: String, 
     required: true, 
     unique: true 
    }, 
    name: { 
     type: String, 
     required: true 
    }, 
    hash: String, 
    salt: String 
}); 



userSchema.methods.setPassword = function (password) { 
    this.salt = crypto.randomBytes(16).toString('hex'); 
    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); 
}; 

//Validating a submitted password 
userSchema.methods.validPassword = function (password) { 
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); 
    return this.hash === hash; 
}; 

//Generating a JSON Web Token 
userSchema.methods.generateJwt = function() { 
    var expiry = new Date(); 
    expiry.setDate(expiry.getDate() + 7); 

    return jwt.sign({ 
     _id: this._id, 
     email: this.email, 
     name: this.name, 
     exp: parseInt(expiry.getTime()/1000) 
    }, process.env.JWT_SECRET); 
}; 

var User = mongoose.model('Users', userSchema); 
var user = new User(); 
user.name = 'Arjun Kumar'; 
user.email = '[email protected]'; 
user.setPassword('myPassword'); 
user.save(); 

'用戶route.js'

'use strict'; 
var express = require('express'), 
    userRoute = express.Router(), 
    jwt = require('express-jwt'), 
    authentication = require('../controllers/authentication'); 

var auth = jwt({ 
    secret: process.env.JWT_SECRET, 
    userProperty: 'payload' 
}); 

userRoute.post('/:adminuserid/register', auth, authentication.register) 
    .post('/login', authentication.login); 

module.exports = userRoute; 

'passport.js'

var passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    mongoose = require('mongoose'), 
    Users = mongoose.model('Users'); 

passport.use(new LocalStrategy({usernameField: 'email'}, function (username, password, done) { 
    Users.findOne({ email: username }, function (err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (!user) {      
      return done(null, false, { 
       message: 'Incorrect username.' 
      }) 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, {  
       message: 'Incorrect password.' 
      }); 
     } 
     return done(null, user); 
    }); 
})); 

回答

0

有一兩件事你可以做到這一點就擺在有條件這樣所有的功能,只授予管理員訪問權限:

If(req.user.email === your admin email) { 

Your function 

} 

這應該是你想只有管理員有權訪問的路線去下。

或者如果你有幾個管理員,那麼你應該改變你的模式,並添加一個admin : Number,你稍後可以聲明,例如任何用戶admin:1是系統管理員否則不是。

我希望我能正確理解你的問題。

祝你好運

+0

Amirani,謝謝你的迴應。你能說我在哪裏需要把這種情況? – Arjun

+0

如果您使用快遞,那麼只需在創建管理員路線時使用它。 –