const jwt = require('jsonwebtoken'); const asyncHandler = require('express-async-handler'); const User = require('../models/User'); const logger = require('../utils/logger'); // 保护路由 - 验证 JWT Token const protect = asyncHandler(async (req, res, next) => { let token; // 从 Authorization 头获取 token if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) { try { // 获取 token token = req.headers.authorization.split(' ')[1]; logger.info(`验证令牌: ${token.substring(0, 15)}...`); // 验证 token const decoded = jwt.verify(token, process.env.JWT_SECRET); logger.info(`令牌有效,用户ID: ${decoded.id}`); // 获取用户并添加到请求对象中,不包含密码 req.user = await User.findById(decoded.id).select('-password'); if (!req.user) { logger.warn(`令牌有效但用户不存在: ${decoded.id}`); res.status(401); throw new Error('未授权,用户不存在'); } next(); } catch (error) { logger.error(`令牌验证失败: ${error.message}`); res.status(401); throw new Error('未授权,token 无效'); } } else { logger.warn(`未提供认证令牌: ${req.originalUrl}`); res.status(401); throw new Error('未授权,未提供 token'); } }); // 限制仅管理员访问 const admin = (req, res, next) => { if (req.user && req.user.isAdmin) { next(); } else { res.status(403); throw new Error('未授权,仅管理员可访问'); } }; module.exports = { protect, admin };