You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何封装管理员鉴权逻辑实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:45:45