如何封装管理员鉴权逻辑实现Node.js多控制器复用?
提取管理员鉴权逻辑为可复用中间件
在Node.js/Express项目中,你可以把重复的鉴权逻辑封装成中间件,这样所有需要管理员权限的控制器都能复用这段代码,不用重复编写。
步骤1:创建鉴权中间件文件
新建一个middlewares/auth.js文件,把原控制器中的鉴权逻辑抽离出来:
import jwt from 'jsonwebtoken'; export const verifyAdmin = async (req, res, next) => { try { const bearerHeader = req.headers['authorization']; if (!bearerHeader) { return res.status(401).json({ auth: false, message: 'No se ha proporcionado token' }); } const bearer = bearerHeader.split(" "); const token = bearer[1]; if (!token) { return res.status(401).json({ auth: false, message: 'No se ha proporcionado token' }); } const decoded = jwt.verify(token, "mi_clave_secreta"); if (decoded.rol !== "Administrador") { return res.status(403).json({ message: 'Prohibido' }); } // 将解码后的用户信息挂载到req对象,后续控制器可按需使用 req.user = decoded; // 调用next(),进入后续的控制器业务逻辑 next(); } catch (error) { return res.status(500).json({ message: error.message }); } };
步骤2:简化原控制器代码
修改createConvocatoria控制器,只保留核心业务逻辑:
import { Convocatoria } from '../models/Convocatoria.js'; export const createConvocatoria = async (req, res) => { try { const { identificador_institucional, pauta_evaluacion, estado_convocatoria, tipo_revision } = req.body; const newConvocatoria = await Convocatoria.create({ identificador_institucional, pauta_evaluacion, estado_convocatoria, tipo_revision }); res.json(newConvocatoria); } catch (error) { return res.status(500).json({ message: error.message }); } };
步骤3:在路由中复用中间件
在路由文件(比如routes/convocatorias.js)中,给需要管理员权限的路由添加verifyAdmin中间件:
import express from 'express'; import { createConvocatoria, updateConvocatoria } from '../controllers/convocatoriaController.js'; import { verifyAdmin } from '../middlewares/auth.js'; const router = express.Router(); // 给创建、更新等接口添加管理员鉴权 router.post('/', verifyAdmin, createConvocatoria); router.put('/:id', verifyAdmin, updateConvocatoria); export default router;
说明
- 中间件会在进入控制器之前完成鉴权:如果鉴权失败,直接返回错误响应;如果通过,就调用
next()让请求进入控制器处理业务逻辑。 - 后续新增的管理员接口(比如
deleteConvocatoria),只需要在路由中加上verifyAdmin中间件即可,完全复用鉴权逻辑。
内容的提问来源于stack exchange,提问作者Felipe Antonio Guzmán Anabalon
相关产品推荐
相关产品推荐

