Я новичок в 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()
затем проверка роли. Cuz, если req.user равно null, вы не можете проверить свойство "admin" из null
if(req.isAuthenticated() && req.user.role == 'admin'){
res.locals.admin = req.user;
}
Функция req.isAuthenticated() предоставляется паспортом.js
TypeError: Cannot read property 'role' of undefined at app.get (C:\Users\IBM_ADMIN\Documents\nauka\ArticlesKnowledgeBase\app.js:77:33)