【问题标题】:Logging with role in Node.js and Express在 Node.js 和 Express 中使用角色进行日志记录
【发布时间】:2017-08-03 11:07:07
【问题描述】:

我是 Node.js 和 Express 的新手,我在使用 Passport 进行访问控制时遇到问题。
我想检查使用哪个角色用户登录。
我的用户架构:

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 文件的一小部分

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);
    });
});

我该如何解决我的问题?

【问题讨论】:

    标签: javascript node.js passport.js


    【解决方案1】:

    你应该检查req.isAuthenticated()然后检查角色。因为如果 req.user 为 null 那么你不能检查 null 的属性'admin'

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

    req.isAuthenticated()函数由passport.js提供

    【讨论】:

    • 我正在尝试这样做,但我得到了这个错误:TypeError: Cannot read property 'role' of undefined at app.get (C:\Users\IBM_ADMIN\Documents\nauka\ArticlesKnowledgeBase\app.js:77:33)
    • 我刚刚编辑了我的答案。抱歉,我在 if 语句和函数 isAuthenticated() 中忘记了 '&&'
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多