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
This commit is contained in:
@@ -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
|
||||
@@ -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('');
|
||||
|
||||
Reference in New Issue
Block a user