gongxiangp2/middleware.ts
2025-10-26 09:11:04 +08:00

68 lines
2.3 KiB
TypeScript

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { getToken } from 'next-auth/jwt'
// 允许的来源列表(内网和公网)
const ALLOWED_ORIGINS = [
'http://192.168.58.20:4320',
'http://180.97.221.140:2320',
'http://localhost:3000',
'http://localhost:4320',
]
export async function middleware(request: NextRequest) {
const { pathname, origin } = request.nextUrl
const requestOrigin = request.headers.get('origin')
// 处理API路由的CORS
if (pathname.startsWith('/api/')) {
// 处理OPTIONS预检请求
if (request.method === 'OPTIONS') {
return new NextResponse(null, {
status: 204,
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': requestOrigin || origin,
'Access-Control-Allow-Methods': 'GET,DELETE,PATCH,POST,PUT,OPTIONS',
'Access-Control-Allow-Headers': 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Authorization, Cookie',
'Access-Control-Max-Age': '86400',
},
})
}
// 为所有API响应添加CORS头
const response = NextResponse.next()
response.headers.set('Access-Control-Allow-Credentials', 'true')
response.headers.set('Access-Control-Allow-Origin', requestOrigin || origin)
response.headers.set('Access-Control-Allow-Methods', 'GET,DELETE,PATCH,POST,PUT,OPTIONS')
response.headers.set('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Authorization, Cookie')
return response
}
// 处理需要认证的页面
if (pathname === '/' || pathname.startsWith('/admin')) {
const token = await getToken({ req: request, secret: process.env.NEXTAUTH_SECRET })
if (!token) {
const url = new URL('/login', request.url)
return NextResponse.redirect(url)
}
// 管理员页面需要管理员权限
if (pathname.startsWith('/admin')) {
if (token.role !== 'ADMIN') {
const url = new URL('/', request.url)
return NextResponse.redirect(url)
}
}
}
return NextResponse.next()
}
export const config = {
matcher: ['/', '/admin/:path*', '/api/:path*'],
}