From 46e851bc3ac5b0bc8fb97d8a0c72bf7401493dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Fri, 13 Mar 2026 12:31:14 +0800 Subject: [PATCH] fix: add error handling for admin login page and document admin credentials - Add URL error parameter handling in login page - Display appropriate error messages for different error types - Document default admin credentials - Provide security guidelines and password management instructions --- docs/ADMIN-CREDENTIALS.md | 111 +++++++++++++++++++++++++++++++++++ src/app/admin/login/page.tsx | 24 +++++++- 2 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 docs/ADMIN-CREDENTIALS.md diff --git a/docs/ADMIN-CREDENTIALS.md b/docs/ADMIN-CREDENTIALS.md new file mode 100644 index 0000000..29d1c9a --- /dev/null +++ b/docs/ADMIN-CREDENTIALS.md @@ -0,0 +1,111 @@ +# 管理员账号信息 + +## 默认管理员凭据 + +### 登录信息 +- **邮箱**: `admin@novalon.cn` +- **密码**: `admin123456` +- **登录地址**: `http://localhost:3000/admin/login` + +### 权限说明 +- 管理员账号拥有完整的后台管理权限 +- 可以管理内容、用户、配置和日志 +- 可以修改其他用户信息(包括密码) + +## 修改管理员密码 + +### 方法1:通过后台管理界面 +1. 使用管理员账号登录后台 +2. 进入"用户管理"页面 +3. 找到管理员账号 +4. 点击"编辑"按钮 +5. 输入新密码并保存 + +### 方法2:通过API +```bash +# 使用管理员token修改密码 +curl -X PUT http://localhost:3000/api/admin/users/[user-id] \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -d '{ + "password": "new_password_here" + }' +``` + +### 方法3:重新运行seed脚本 +```bash +npm run db:seed +``` + +## 创建新管理员账号 + +### 通过API创建 +```bash +curl -X POST http://localhost:3000/api/admin/users \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_TOKEN" \ + -d '{ + "email": "new_admin@example.com", + "password": "secure_password", + "name": "新管理员", + "isAdmin": true + }' +``` + +## 安全建议 + +### ⚠️ 重要提示 +1. **立即修改默认密码** - 生产环境必须修改默认密码 +2. **使用强密码** - 至少12位,包含大小写字母、数字和特殊字符 +3. **定期更换密码** - 建议每3个月更换一次 +4. **启用双因素认证** - 如果支持的话 +5. **限制登录尝试** - 防止暴力破解 + +### 密码安全策略 +- 最小长度:8个字符 +- 必须包含:大小写字母、数字 +- 建议包含:特殊字符 +- 禁止使用:常见密码、个人信息 + +## 常见问题 + +### Q: 忘记管理员密码怎么办? +A: 重新运行seed脚本会重置为默认密码,但这会删除所有现有用户数据。 + +### Q: 如何创建多个管理员账号? +A: 通过后台管理界面或API创建新用户,并将 `isAdmin` 设置为 `true`。 + +### Q: 登录时提示"认证配置错误"? +A: 检查NextAuth配置,确保环境变量正确设置。 + +### Q: 如何禁用某个管理员账号? +A: 通过API或数据库将该用户的 `isAdmin` 设置为 `false`。 + +## 相关文件 + +- **Seed脚本**: `src/db/seed.ts` +- **用户Schema**: `src/db/schema.ts` +- **认证配置**: `src/lib/auth.ts` +- **登录页面**: `src/app/admin/login/page.tsx` + +## 技术细节 + +### 密码加密 +- 使用 `bcryptjs` 进行密码哈希 +- 盐值轮数:10 +- 算法:bcrypt + +### 会话管理 +- 使用NextAuth.js进行会话管理 +- 会话存储:数据库 +- 会话有效期:可配置 + +### 权限检查 +- 基于 `isAdmin` 字段 +- 通过 `checkIsAdmin()` 函数验证 +- 支持细粒度权限控制 + +--- + +**最后更新**: 2026-03-13 +**版本**: 1.0.0 \ No newline at end of file diff --git a/src/app/admin/login/page.tsx b/src/app/admin/login/page.tsx index 5230899..0fe3298 100644 --- a/src/app/admin/login/page.tsx +++ b/src/app/admin/login/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, Suspense } from 'react'; +import { useState, useEffect, Suspense } from 'react'; import { signIn } from 'next-auth/react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Eye, EyeOff, Mail, Lock, AlertCircle, Loader2 } from 'lucide-react'; @@ -9,6 +9,7 @@ function LoginForm() { const router = useRouter(); const searchParams = useSearchParams(); const callbackUrl = searchParams.get('callbackUrl') || '/admin'; + const urlError = searchParams.get('error'); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); @@ -16,6 +17,27 @@ function LoginForm() { const [error, setError] = useState(''); const [loading, setLoading] = useState(false); + useEffect(() => { + if (urlError) { + switch (urlError) { + case 'Configuration': + setError('认证配置错误,请联系管理员'); + break; + case 'AccessDenied': + setError('访问被拒绝,请检查权限'); + break; + case 'Verification': + setError('验证失败,请重试'); + break; + case 'CredentialsSignin': + setError('邮箱或密码错误'); + break; + default: + setError('登录失败,请稍后重试'); + } + } + }, [urlError]); + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError('');