2017-07-30 73 views
1

我是Node.js和Express中的新成员,并且在Passport访问控制方面存在问题。
我要检查与角色用户登录
我的用户模式:在Node.js和Express中记录角色

let mongoose = require('mongoose'); 

let userSchema = new mongoose.Schema({ 
    name:{ 
    type: String, 
    required: true 
    }, 
    email:{ 
    type: String, 
    required: true 
    }, 
    password:{ 
    type: String, 
    required: true 
    }, 
    username:{ 
    type: String, 
    required: true 
    }, 
    role:{ 
    type: String, 
    default: 'user' 
    }, 
    activated:{ 
    type: Boolean, 
    default: false 
    } 
}); 

let User = module.exports = mongoose.model('User', userSchema); 

我passport.js文件

const LocalStrategy = require('passport-local').Strategy; 
const User = require('../models/user'); 
const dbConfig = require('../config/database'); 
const bcrypt = require('bcrypt'); 

module.exports = (passport) => { 
    //Local Strategy 
    passport.use(new LocalStrategy((email, password, done) => { 
     //Match email 
     let query = {email: email} 
     User.findOne(query, (err, user) => { 
     if(err){ 
      console.log(err); 
     } 
     if(!user) { 
      return done(null, false, {message: 'No user found'}); 
     } 

     //Match password 
     bcrypt.compare(password, user.password, (err, isMatch) => { 
      if(err){ 
      console.log(err); 
      } 
      if(isMatch){ 
      return done(null, user); 
      } else { 
      return done(null, false, {message: 'Wrong password'}); 
      } 
     }); 
     }); 
    })); 

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

    passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
    }); 
} 

app.js文件,其中我的小部分m设置全局变量用户

app.get('*', (req, res, next) => { 
    res.locals.user = req.user || null; 
    next(); 
}); 

我使用全局用户变量的layout.pug文件的一部分

.navbar.collapse.navbar-collapse 
     ul.nav.navbar-nav 
     li 
      a(href='/') Home 
     if user 
      li 
      a(href='/articles/add') Add article 

我想要做的是检查用户是否具有管理员角色。我试图以不同的方式做到这一点,但没有成功。我想检查在app.js的作用,但我得到的错误:

if(req.user.role == 'admin'){ 
    res.locals.admin = req.user; 
} 

此外,我想在passport.js仅传递作用,这是工作然后,但我还需要用户的其他财产。

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 

我该如何解决我的问题?

回答

0

您应该检查是否req.isAuthenticated()然后检查角色。如果的Cuz是req.user空,那么你可以不检查

if(req.isAuthenticated() && req.user.role == 'admin'){ 
    res.locals.admin = req.user; 
} 

的req.isAuthenticated()函数由passport.js提供空的财产“管理员”

+0

我试着做某事像,但我得到了这个错误:'TypeError:无法读取属性'角色'的未定义 在app.get(C:\ Users \ IBM_ADMIN \ Documents \ nauka \ ArticlesKnowledgeBase \ app.js:77:33)' – robmax

+0

我只是编辑我的答案。对不起,我忘记'&&如果语句和函数isAuthenticated() –

+0

你可以看看我的项目,看看例子 https://gitlab.com/yyyyaaa/group-profile/blob/master/server/routes.js –