【问题标题】:MERN stack access controlMERN堆栈访问控制
【发布时间】:2020-03-20 20:46:00
【问题描述】:

我最后一直在使用 MERN 堆栈,我知道如何验证用户身份(检查他是否正确登录),但我真的不知道并且在角色/权限方面感到有点困惑。

我现在正在使用 JWT,想知道这个堆栈是如何处理访问控制的。

例如对于博客,管理员应该能够从 API 获取所有注册用户,但普通用户或版主不应该。

哪些工具可以帮助我解决这个问题?

【问题讨论】:

    标签: node.js authentication jwt authorization mern


    【解决方案1】:

    我的建议是在用户帐户上设置权限级别并仅通过 JWT 令牌中的电子邮件,在 express 中创建一个中间件,检查 jwt 令牌是否有效,如果不是,则返回 401 状态(未经授权)

    如果通过则解码 jwt 并将电子邮件作为 res.locals.email 传递给 express 的 res.locals

    创建另一个使用第一个中间件的中间件,使用您保存在 express 的 res.local 中的电子邮件找到您想要的用户。

    根据email搜索找到一个用户(假设email是唯一值),如果用户是高级别则执行next()函数,否则抛出错误401

    验证中间件:

    import { NextFunction, Request, Response } from 'express';
    import jwt from 'jsonwebtoken';
    
    export default async (req: Request, res: Response, next: NextFunction) => {
    const token = req.headers['x-access-token'] || req.headers.authorization;
    if (!token) {
        return res.status(401).send('Access denied.');
    }
    try {
        const tokenPart = (token as string).split(' ')[1];
        const decode = jwt.verify(tokenPart, String(process.env.JWT_SECRET));
        const userMail = Object(decode).email;
        res.locals.email = userMail;
    
        next();
    } catch (err) {
        res.status(400).json({ message: 'Invalid token' });
    }
    };
    

    授权中间件:

    import { NextFunction, Request, Response } from 'express';
    import user from '../models/modelFunctions/userModelFunction';
    
    export default async (req: Request, res: Response, next: NextFunction) => {
      const userData = await user.findOne({ email: res.locals.email });
    if (userData.level === 'admin') {
        next();
    } else {
        res.status(401).send('Unauthorized, you cannot perform this action');
    }
    };
    

    我以前用 typescript 写过这个,但你可以在 javascript 中做同样的事情,只需删除我添加的类型

    而我的 jwt 将只有电子邮件地址而已

    【讨论】:

    • 谢谢!不知道我可以在没有 auth0 或护照的情况下做到这一点
    • @LawlietLawsford 这很有挑战性,但请记住,这只有在您打算仅使用 JWT 时才有效。如果您想集成其他服务,则更推荐使用护照,否则此解决方案有效
    猜你喜欢
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2022-11-25
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多