chore: mqsrv backend
This commit is contained in:
114
src/middleware/auth.ts
Normal file
114
src/middleware/auth.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
import { verifyToken, extractToken } from '../utils/jwt';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
// 扩展 Request 类型
|
||||
declare global {
|
||||
namespace Express {
|
||||
interface Request {
|
||||
user?: {
|
||||
userId: string;
|
||||
username: string;
|
||||
email: string;
|
||||
isVip: boolean;
|
||||
vipLevel: number;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 认证中间件
|
||||
*/
|
||||
export async function authMiddleware(req: Request, res: Response, next: NextFunction) {
|
||||
try {
|
||||
const token = extractToken(req.headers.authorization);
|
||||
|
||||
if (!token) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: '访问令牌缺失,请先登录',
|
||||
code: 'NO_TOKEN',
|
||||
});
|
||||
}
|
||||
|
||||
const payload = verifyToken(token);
|
||||
|
||||
if (!payload) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: '访问令牌无效或已过期',
|
||||
code: 'INVALID_TOKEN',
|
||||
});
|
||||
}
|
||||
|
||||
// 检查用户是否存在且未被删除
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: payload.userId },
|
||||
select: { id: true, deletedAt: true },
|
||||
});
|
||||
|
||||
if (!user || user.deletedAt) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: '用户不存在或已被禁用',
|
||||
code: 'USER_NOT_FOUND',
|
||||
});
|
||||
}
|
||||
|
||||
// 将用户信息附加到请求对象
|
||||
req.user = payload;
|
||||
next();
|
||||
} catch (error) {
|
||||
console.error('Auth middleware error:', error);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: '认证服务异常',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 可选认证中间件(不强制要求登录)
|
||||
*/
|
||||
export async function optionalAuth(req: Request, res: Response, next: NextFunction) {
|
||||
try {
|
||||
const token = extractToken(req.headers.authorization);
|
||||
|
||||
if (token) {
|
||||
const payload = verifyToken(token);
|
||||
if (payload) {
|
||||
req.user = payload;
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
} catch (error) {
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* VIP 认证中间件(要求 VIP 用户)
|
||||
*/
|
||||
export async function vipMiddleware(req: Request, res: Response, next: NextFunction) {
|
||||
if (!req.user) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: '请先登录',
|
||||
code: 'NO_TOKEN',
|
||||
});
|
||||
}
|
||||
|
||||
if (!req.user.isVip) {
|
||||
return res.status(403).json({
|
||||
success: false,
|
||||
message: '此功能仅限 VIP 用户使用',
|
||||
code: 'VIP_REQUIRED',
|
||||
});
|
||||
}
|
||||
|
||||
next();
|
||||
}
|
||||
Reference in New Issue
Block a user