suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Fügen Sie dem geschützten Routing mehrere Rollen hinzu (Node + Express + JWT)

Ich versuche, einige Routen mithilfe von Benutzerrollen zu sichern (einige Routen akzeptieren mehrere Rollen). Wenn ich die akzeptierten Rollen im Route-Handler aufliste, wird nur der ersten aufgeführten Benutzerrolle Zugriff gewährt – ich muss den Zugriff für alle aufgelisteten Rollen zulassen.

Dies ist die Authentifizierungs-Middleware-Datei (auth.js), die das JWT-Token dekodiert:

import jwt from "jsonwebtoken";

const auth = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!token)
    return res
      .status(401)
      .send({ message: "Access denied. No token provided!" });

  try {
    const decoded = jwt.verify(token, "SomethingPrivate");
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).send({ message: "Invalid Token." });
  }
};

export const superAdmin = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!auth && !token)
    return res.status(401).send({ message: "Access denied." });

  const decoded = jwt.verify(token, "SomethingPrivate");
  if (auth && decoded.role === "superAdmin") {
    res.status(200);
    next();
  } else {
    res.status(400).send({ message: "Access denied!" });
  }
};

export const admin = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!auth && !token)
    return res.status(401).send({ message: "Access denied." });

  const decoded = jwt.verify(token, "SomethingPrivate");
  if (auth && decoded.role === "admin") {
    res.status(200);
    next();
  } else {
    res.status(400).send({ message: "Access denied!" });
  }
};

export const teacher = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!auth || !token)
    return res.status(401).send({ message: "Access denied." });

  const decoded = jwt.verify(token, "SomethingPrivate");
  if (auth && decoded.role === "teacher") {
    res.status(200);
    next();
  } else {
    res.status(400).send({ message: "Access denied!" });
  }
};

export const student = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!auth || !token)
    return res.status(401).send({ message: "Access denied." });

  const decoded = jwt.verify(token, "SomethingPrivate");
  if (auth && decoded.role === "student") {
    res.status(200);
    next();
  } else {
    res.status(400).send({ message: "Access denied!" });
  }
};

export const parent = (req, res, next) => {
  const token = req.header("x-auth-token");
  if (!auth) return res.status(401).send({ message: "Access denied." });

  const decoded = jwt.verify(token, "SomethingPrivate");
  if (auth && decoded.role === "parent") {
    res.status(200);
    next();
  } else {
    res.status(400).send({ message: "Access denied!" });
  }
};

Dies ist die Router-Datei (userRoute.js):

import express from "express";
import {
  superAdmin,
  admin,
  teacher,
  student,
  parent,
} from "../middleware/auth.js";
const router = express.Router();
import {
  view,
  find,
  me,
  create,
  edit,
  update,
  viewUser,
} from "../controllers/userController.js";

// Routes
router.get("/", [superAdmin, admin], view); //The route I am struggling with at the moment//
router.post("/", find);
router.get("/me", me);
router.post("/create", superAdmin, create);
router.get("/edituser/:userID", edit);
router.post("/edituser/:userID", [], update);
router.get("/viewuser/:userID", viewUser);


export { router as user };

Abschließend werden die Daten für die JWT-Payload beim Signieren beim Login eingefügt und im Antwortheader gespeichert:

const token = jwt.sign(
              {
                userID: result[0].userID,
                firstName: result[0].firstName,
                lastName: result[0].lastName,
                email: result[0].email,
                role: result[0].role,
              },

In der userRoute.js-Datei habe ich versucht, einen Pipe-Operator zwischen den einzelnen akzeptierten Rollen für diese Route zu verwenden, aber ich schaffe es anscheinend nicht, die Rollen als boolesche Werte zu behandeln.

Jede Hilfe wäre sehr dankbar! (Dies ist das Backend, das in naher Zukunft mit dem React-Frontend gepaart wird.)

P粉476547076P粉476547076289 Tage vor295

Antworte allen(1)Ich werde antworten

  • P粉369196603

    P粉3691966032024-02-18 10:42:11

    中间件函数数组始终像按顺序指定路由一样工作。这意味着,如果您在其中一个中间件函数中调用 res.send(),则数组中的所有下一个函数都尚未使用。

    我会这样建议,例如:

    用于家长、学生、管理员访问路由的中间件

    export const parent = (req, res, next) => {
      const token = req.header("x-auth-token");
      if (!auth) return res.status(401).send({ message: "Access denied." });
    
      const decoded = jwt.verify(token, "SomethingPrivate");
      if (auth && ["parent", "student", "admin"].includes(decoded.role)) {
        res.status(200);
      } else {
        res.status(400).send({ message: "Access denied!" });
      }
    };

    仅由 admin 访问的路由中间件:

    export const parent = (req, res, next) => {
      const token = req.header("x-auth-token");
      if (!auth) return res.status(401).send({ message: "Access denied." });
    
      const decoded = jwt.verify(token, "SomethingPrivate");
      if (auth && ["admin"].includes(decoded.role))) {
        res.status(200);
      } else {
        res.status(400).send({ message: "Access denied!" });
      }
    };

    Antwort
    0
  • StornierenAntwort