Saya cuba mendapatkan beberapa laluan menggunakan peranan pengguna (sesetengah laluan menerima berbilang peranan). Apabila saya menyenaraikan peranan yang diterima dalam pengendali laluan, hanya peranan pengguna pertama yang disenaraikan dibenarkan akses - saya perlu membenarkan akses untuk semua peranan yang disenaraikan.
Ini ialah fail middleware pengesahan (auth.js
) yang menyahkod token JWT:
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!" }); } };
Ini ialah fail penghala (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 };
Akhir sekali, data untuk muatan JWT dimasukkan semasa mendaftar masuk dan disimpan dalam pengepala respons:
const token = jwt.sign( { userID: result[0].userID, firstName: result[0].firstName, lastName: result[0].lastName, email: result[0].email, role: result[0].role, },
Dalam fail userRoute.js
, saya cuba menggunakan operator paip di antara setiap peranan yang diterima untuk laluan itu, tetapi saya nampaknya tidak boleh mendapatkan peranan itu untuk dianggap sebagai boolean.
Sebarang bantuan akan sangat dihargai! (Ini adalah bahagian belakang yang akan digandingkan dengan bahagian hadapan React dalam masa terdekat.)
Tatasusunan fungsi middleware sentiasa berfungsi seperti laluan yang ditentukan mengikut tertib. Ini bermakna jika anda memanggil
res.send()
di dalam salah satu fungsi perisian tengah anda, semua fungsi seterusnya dalam tatasusunan belum digunakan lagi.Saya akan mencadangkan ini, sebagai contoh:
untuk
家长、学生、管理员访问路由的中间件
Perisian tengah penghalaan hanya boleh diakses oleh
admin
: