const jwt = require('jsonwebtoken'); const { User, Role } = require('../models'); /** * 验证JWT Token的中间件 * @param {Object} req - 请求对象 * @param {Object} res - 响应对象 * @param {Function} next - 下一步函数 */ const verifyToken = async (req, res, next) => { try { // 从请求头获取token const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN if (!token) { return res.status(401).json({ success: false, message: '未授权' }); } // 验证token const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your_jwt_secret_key'); // 将用户信息添加到请求对象中 req.user = decoded; next(); } catch (error) { return res.status(401).json({ success: false, message: '未授权' }); } }; /** * 检查用户是否具有指定角色的中间件 * @param {string[]} roles - 允许访问的角色数组 * @returns {Function} 中间件函数 */ const checkRole = (roles) => { return async (req, res, next) => { try { const userId = req.user.id; // 查询用户及其角色 const user = await User.findByPk(userId, { include: [{ model: Role, as: 'roles', // 添加as属性,指定关联别名 attributes: ['name'] }] }); if (!user) { return res.status(404).json({ success: false, message: '用户不存在' }); } // 获取用户角色名称数组 const userRoles = user.roles.map(role => role.name); // 检查用户是否具有所需角色 const hasRequiredRole = roles.some(role => userRoles.includes(role)); if (!hasRequiredRole) { return res.status(403).json({ success: false, message: '权限不足' }); } next(); } catch (error) { console.error('角色检查错误:', error); return res.status(500).json({ success: false, message: '服务器内部错误' }); } }; }; module.exports = { verifyToken, checkRole };