#node.js #express #mongoose #jwt
Вопрос:
Я создаю простое узловое приложение js с помощью express, я хочу назначить роль пользователя и разрешение, код успешно запущен, но я не получаю желаемого результата… пользователь с ролью «администратор» не может получить доступ к административному маршруту.
const jwt = require('jsonwebtoken')
const User = require('../model/User')
function authUser(req, res, next) {
const token = req.header('auth-token');
if (!token) return res.status(401).send('Access Denied');
try {
const verified = jwt.verify(token, process.env.TOKEN_SECRET);
req.user = verified;
next();
} catch (err) {
res.status(400).send('Invalid Token');
}
}
function authRole(...roles) {
return (req, res, next) => {
if (!roles.includes(req.user.userRole)) {
res.status(401)
return res.send('Not allowed')
}
next();
}
}
module.exports = {
authUser,
authRole
}
это административный маршрут ниже
const router = require('express').Router();
const { authUser, authRole } = require('../secure/verifyToken');
router.get("/", authUser, authRole('admin'), (req, res) => {
res.send('admin page')
})
module.exports = router;
когда я тестировал код с почтальоном, я все равно получал несанкционированное сообщение «Не разрешено».
любое решение, пожалуйста.
Ответ №1:
В вашем административном маршруте вы не можете вызвать эту функцию. Простое решение состоит в том, чтобы вместо этого вызвать функцию внутри обратного вызова маршрута.
Смотрите мое полное решение ниже:
Маршрутизатор:
const router = require('express').Router();
const { authUser, authRole } = require('../secure/verifyToken');
router.get("/", authUser, (req, res) => { // Listen for the incoming request
if (!authRole(req, res, ['admin'])) return; // If the users role does not include "admin", return
res.send('admin page') // If the user is authorized, send the "admin page".
})
module.exports = router;
функции аутентификации:
const jwt = require('jsonwebtoken')
const User = require('../model/User')
function authUser(req, res, next) {
const token = req.header('auth-token');
if (!token) return res.status(401).send('Access Denied');
try {
const verified = jwt.verify(token, process.env.TOKEN_SECRET);
req.user = verified;
next();
} catch (err) {
res.status(400).send('Invalid Token');
}
}
function authRole(req, res, roles) {
if (!roles.includes(req.user.userRole)) { // If the roles array doesn't include the users role
res.status(401);
res.send('Not allowed'); // Send the user with the not authorized error
return false; // Return false to prevent errors in your router
}
return true; // If everything looks good, return true
}
module.exports = {
authUser,
authRole
}
Комментарии:
1. @NOTCHTRENDMEDIA Не могли бы вы предоставить некоторые коды ошибок?