修复登录bug

This commit is contained in:
2025-08-05 22:42:02 +08:00
parent a3264be5f6
commit 0edceecfe5
5 changed files with 37 additions and 22 deletions

View File

@@ -239,7 +239,7 @@ export const authController = {
}, },
// 用户登出 // 用户登出
async logout(req: AuthRequest, res: Response) { async logout(req: Request, res: Response) {
const token = req.headers.authorization?.substring(7); const token = req.headers.authorization?.substring(7);
if (token) { if (token) {
@@ -249,18 +249,26 @@ export const authController = {
}); });
} }
// Create audit log // Create audit log (if we have user info from token)
if (req.user) { try {
await prisma.auditLog.create({ if (token) {
data: { const decoded = jwt.verify(token, "pandora") as any;
userId: req.user.id, if (decoded && decoded.userId) {
action: 'USER_LOGOUT', await prisma.auditLog.create({
resource: 'user', data: {
resourceId: req.user.id, userId: decoded.userId,
ipAddress: (req.headers['x-forwarded-for'] as string) || req.socket.remoteAddress || null, action: 'USER_LOGOUT',
userAgent: req.get('User-Agent') ?? null, resource: 'user',
resourceId: decoded.userId,
ipAddress: (req.headers['x-forwarded-for'] as string) || req.socket.remoteAddress || null,
userAgent: req.get('User-Agent') ?? null,
}
});
} }
}); }
} catch (error) {
// Token无效不记录审计日志
console.log('登出时token无效跳过审计日志记录');
} }
res.json({ message: '登出成功' }); res.json({ message: '登出成功' });

View File

@@ -27,7 +27,7 @@ router.post('/login', [
], authController.login); ], authController.login);
// Logout // Logout
router.post('/logout', authMiddleware, authController.logout); router.post('/logout', authController.logout);
// Get current user // Get current user
router.get('/me', authMiddleware, authController.getCurrentUser); router.get('/me', authMiddleware, authController.getCurrentUser);

View File

@@ -1,5 +1,4 @@
import type { RouteRecordRaw, NavigationGuardNext, RouteLocationNormalized } from 'vue-router' import { createRouter, createWebHistory, type RouteRecordRaw, type NavigationGuardNext, type RouteLocationNormalized } from 'vue-router'
import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth' import { useAuthStore } from '@/stores/auth'
import { adminAuth } from '@/utils/auth' import { adminAuth } from '@/utils/auth'
@@ -76,11 +75,6 @@ router.beforeEach(async (
document.title = `${title} - AI` document.title = `${title} - AI`
const authStore = useAuthStore() const authStore = useAuthStore()
// 用户已登录重定向到dashboard
if (to.path === '/' && authStore.isLoggedIn) {
next({ name: 'Dashboard' })
return
}
// 检查是否需要用户认证 // 检查是否需要用户认证
if (to.meta.requiresAuth) { if (to.meta.requiresAuth) {
@@ -98,6 +92,12 @@ router.beforeEach(async (
} }
} }
// 用户已登录且访问首页重定向到dashboard
if (to.path === '/' && authStore.isLoggedIn) {
next({ name: 'Dashboard' })
return
}
next() next()
}) })

View File

@@ -41,6 +41,11 @@ api.interceptors.response.use(
}, },
(error) => { (error) => {
if (error.response?.status === 401) { if (error.response?.status === 401) {
// 如果是登出请求,不要自动重定向
if (error.config?.url?.includes('/auth/logout')) {
return Promise.reject(error)
}
// Token过期或无效清除所有认证状态 // Token过期或无效清除所有认证状态
userAuth.logout() userAuth.logout()
adminAuth.logout() adminAuth.logout()

View File

@@ -202,7 +202,7 @@ const loadUserAccounts = async () => {
onMounted(async () => { onMounted(async () => {
try { try {
// 初始化认证状态 // 初始化认证状态
authStore.initAuth() await authStore.initAuth()
// 确保用户已登录 // 确保用户已登录
if (!authStore.isLoggedIn) { if (!authStore.isLoggedIn) {
@@ -222,6 +222,8 @@ onMounted(async () => {
router.push('/') router.push('/')
return return
} }
// 其他错误,继续尝试加载账号
console.warn('获取用户信息失败,但继续加载账号:', error)
} }
// 加载用户账号 // 加载用户账号