/** * 认证中间件 * @file auth.js * @description JWT认证中间件 */ const jwt = require('jsonwebtoken'); const { User } = require('../models'); /** * JWT认证中间件 * @param {Object} req 请求对象 * @param {Object} res 响应对象 * @param {Function} next 下一个中间件 */ const authMiddleware = async (req, res, next) => { try { // 从请求头获取token const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ success: false, message: '未提供认证令牌' }); } const token = authHeader.substring(7); // 移除 'Bearer ' 前缀 // 验证token const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your_jwt_secret_key_here'); // 查找用户 const user = await User.findByPk(decoded.userId); if (!user) { return res.status(401).json({ success: false, message: '用户不存在' }); } // 检查用户状态 if (user.status !== 'active') { return res.status(401).json({ success: false, message: '账户已被禁用' }); } // 将用户信息添加到请求对象 req.user = { userId: user.id, username: user.username, role: decoded.role }; next(); } catch (error) { if (error.name === 'JsonWebTokenError') { return res.status(401).json({ success: false, message: '无效的认证令牌' }); } if (error.name === 'TokenExpiredError') { return res.status(401).json({ success: false, message: '认证令牌已过期' }); } console.error('认证中间件错误:', error); res.status(500).json({ success: false, message: '服务器内部错误' }); } }; /** * 角色权限中间件 * @param {Array|String} roles 允许的角色 * @returns {Function} 中间件函数 */ const roleMiddleware = (roles) => { return (req, res, next) => { try { const userRole = req.user?.role; if (!userRole) { return res.status(401).json({ success: false, message: '未认证用户' }); } const allowedRoles = Array.isArray(roles) ? roles : [roles]; if (!allowedRoles.includes(userRole)) { return res.status(403).json({ success: false, message: '权限不足' }); } next(); } catch (error) { console.error('角色权限中间件错误:', error); res.status(500).json({ success: false, message: '服务器内部错误' }); } }; }; /** * 管理员权限中间件 */ const adminMiddleware = roleMiddleware(['admin']); /** * 管理员或经理权限中间件 */ const managerMiddleware = roleMiddleware(['admin', 'manager']); /** * 管理员、经理或柜员权限中间件 */ const tellerMiddleware = roleMiddleware(['admin', 'manager', 'teller']); module.exports = { authMiddleware, roleMiddleware, adminMiddleware, managerMiddleware, tellerMiddleware };