const jwt = require('jsonwebtoken'); const db = require('../db'); require('dotenv').config(); const verifyToken = async (req, res, next) => { // 优先从 Header 获取,如果没有则从 Query String 获取(用于下载接口) const token = req.headers['authorization']?.split(' ')[1] || req.query.token; if (!token) { return res.status(401).json({ message: '未提供认证令牌' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); // 单点登录检查:比对 Token 中的版本号与数据库中的版本号 // 如果 Token 中没有 version (旧 Token),视为 0 const tokenVersion = decoded.token_version || 0; const result = await db.query('SELECT token_version FROM users WHERE id = $1', [decoded.id]); if (result.rows.length === 0) { return res.status(401).json({ message: '用户不存在' }); } const dbVersion = result.rows[0].token_version || 0; if (tokenVersion !== dbVersion) { return res.status(401).json({ message: '您的账号已在其他设备登录,请重新登录' }); } req.user = decoded; next(); } catch (err) { if (err.name === 'TokenExpiredError') { return res.status(401).json({ message: '登录已过期,请重新登录' }); } return res.status(401).json({ message: '无效的令牌' }); } }; const isAdmin = (req, res, next) => { if (req.user && (req.user.role === 'admin' || req.user.role === 'super_admin')) { next(); } else { return res.status(403).json({ message: '需要管理员权限' }); } }; const isSuperAdmin = (req, res, next) => { if (req.user && req.user.role === 'super_admin') { next(); } else { return res.status(403).json({ message: '需要超级管理员权限' }); } }; const isMaintainer = (req, res, next) => { if (req.user && req.user.role === 'maintainer') { next(); } else { return res.status(403).json({ message: '需要系统维护员权限' }); } }; // 系统管理员权限:超级管理员 OR 系统维护员 const isSystemAdmin = (req, res, next) => { if (req.user && (req.user.role === 'super_admin' || req.user.role === 'maintainer')) { next(); } else { return res.status(403).json({ message: '需要系统管理权限' }); } }; module.exports = { verifyToken, isAdmin, isSuperAdmin, isMaintainer, isSystemAdmin };