v1
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
import { NextRequest } from 'next/server'
|
||||
import { verifyToken } from '@/lib/auth'
|
||||
import { prisma } from '@/lib/prisma'
|
||||
|
||||
export async function requireAdmin(request: NextRequest) {
|
||||
const authHeader = request.headers.get('Authorization')
|
||||
const token = authHeader?.replace('Bearer ', '')
|
||||
|
||||
if (!token) {
|
||||
throw new Error('未提供认证令牌')
|
||||
}
|
||||
|
||||
const decoded = verifyToken(token)
|
||||
if (!decoded) {
|
||||
throw new Error('无效的认证令牌')
|
||||
}
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: decoded.userId },
|
||||
select: { id: true, isAdmin: true }
|
||||
})
|
||||
|
||||
if (!user || !user.isAdmin) {
|
||||
throw new Error('权限不足')
|
||||
}
|
||||
|
||||
return user
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
import bcrypt from 'bcryptjs'
|
||||
import jwt from 'jsonwebtoken'
|
||||
|
||||
const JWT_SECRET = process.env.JWT_SECRET || 'your-jwt-secret-here'
|
||||
|
||||
export async function hashPassword(password: string): Promise<string> {
|
||||
return await bcrypt.hash(password, 12)
|
||||
}
|
||||
|
||||
export async function verifyPassword(password: string, hashedPassword: string): Promise<boolean> {
|
||||
return await bcrypt.compare(password, hashedPassword)
|
||||
}
|
||||
|
||||
export function generateToken(payload: any): string {
|
||||
return jwt.sign(payload, JWT_SECRET, { expiresIn: '7d' })
|
||||
}
|
||||
|
||||
export function verifyToken(token: string): any {
|
||||
try {
|
||||
return jwt.verify(token, JWT_SECRET)
|
||||
} catch (error) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
|
||||
const globalForPrisma = globalThis as unknown as {
|
||||
prisma: PrismaClient | undefined
|
||||
}
|
||||
|
||||
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
|
||||
Reference in New Issue
Block a user