100 lines
2.2 KiB
JavaScript
100 lines
2.2 KiB
JavaScript
|
|
const jwt = require('jsonwebtoken');
|
|||
|
|
const User = require('../models/User');
|
|||
|
|
|
|||
|
|
// JWT 密钥
|
|||
|
|
const JWT_SECRET = process.env.JWT_SECRET || 'rentease-secret-key';
|
|||
|
|
|
|||
|
|
// 生成 Token(2小时有效期)
|
|||
|
|
const generateToken = (user) => {
|
|||
|
|
return jwt.sign(
|
|||
|
|
{
|
|||
|
|
id: user.id,
|
|||
|
|
username: user.username,
|
|||
|
|
role: user.role?.code || user.role
|
|||
|
|
},
|
|||
|
|
JWT_SECRET,
|
|||
|
|
{ expiresIn: '2h' }
|
|||
|
|
);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 验证 Token 中间件
|
|||
|
|
const authMiddleware = async (req, res, next) => {
|
|||
|
|
try {
|
|||
|
|
const authHeader = req.headers.authorization;
|
|||
|
|
|
|||
|
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
code: 401,
|
|||
|
|
message: '未提供认证令牌'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const token = authHeader.substring(7);
|
|||
|
|
|
|||
|
|
// 验证 Token
|
|||
|
|
const decoded = jwt.verify(token, JWT_SECRET);
|
|||
|
|
|
|||
|
|
// 检查用户是否存在且状态正常
|
|||
|
|
const user = await User.findOne({
|
|||
|
|
where: {
|
|||
|
|
id: decoded.id,
|
|||
|
|
status: 'active'
|
|||
|
|
},
|
|||
|
|
attributes: ['id', 'username', 'nickname', 'roleId', 'status'],
|
|||
|
|
include: [{
|
|||
|
|
model: require('../models/Role'),
|
|||
|
|
as: 'role',
|
|||
|
|
attributes: ['id', 'name', 'code']
|
|||
|
|
}]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
if (!user) {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
code: 401,
|
|||
|
|
message: '用户不存在或已被禁用'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 将用户信息附加到请求对象
|
|||
|
|
req.user = user;
|
|||
|
|
next();
|
|||
|
|
} catch (error) {
|
|||
|
|
if (error.name === 'TokenExpiredError') {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
code: 401,
|
|||
|
|
message: '登录已过期,请重新登录'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
if (error.name === 'JsonWebTokenError') {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
code: 401,
|
|||
|
|
message: '无效的认证令牌'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return res.status(500).json({
|
|||
|
|
code: 500,
|
|||
|
|
message: '认证失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 管理员权限检查中间件
|
|||
|
|
const adminMiddleware = (req, res, next) => {
|
|||
|
|
const userRole = req.user.role?.code || req.user.role;
|
|||
|
|
if (userRole !== 'admin') {
|
|||
|
|
return res.status(403).json({
|
|||
|
|
code: 403,
|
|||
|
|
message: '没有权限执行此操作'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
next();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
module.exports = {
|
|||
|
|
generateToken,
|
|||
|
|
authMiddleware,
|
|||
|
|
adminMiddleware,
|
|||
|
|
JWT_SECRET
|
|||
|
|
};
|