Spaces:
Sleeping
Sleeping
| 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 }; |