簡體   English   中英

在Node.js和Express中以角色登錄

[英]Logging with role in Node.js and Express

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

我該如何解決我的問題?

您應該檢查是否req.isAuthenticated()然后檢查角色。 因為req.user為null,則無法檢查null的屬性“ admin”

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM