138 lines
3.1 KiB
JavaScript
138 lines
3.1 KiB
JavaScript
/**
|
|
* 认证中间件
|
|
* @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
|
|
}; |