Роль и разрешение в узле js не работают

#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 Не могли бы вы предоставить некоторые коды ошибок?