【问题标题】:Role and Permission in Node js not workingNode js中的角色和权限不起作用
【发布时间】:2021-10-12 10:14:33
【问题描述】:

我正在使用 express 构建一个简单的节点 js 应用程序,我想分配用户角色和权限,代码运行成功但我没有得到想要的结果......具有“管理员”角色的用户不是能够访问管理员路由。

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;

当我用邮递员测试代码时,我仍然收到一条未经授权的消息“不允许”。

请提供任何解决方案。

【问题讨论】:

    标签: node.js express mongoose jwt


    【解决方案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
    }
    

    【讨论】:

    • @NOTCHTRENDMEDIA 你能提供一些错误代码吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2022-10-20
    • 2014-04-14
    • 2022-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多