# 管理员登录认证系统设计文档

## 概述

本系统实现了普通用户和管理员用户的双重登录认证机制，两者相互独立，互不影响。

## 系统架构

### 用户类型区分

系统通过JWT Token中的`userType`字段区分用户类型：
- `user`: 普通用户
- `admin`: 管理员用户

### 核心组件

1. **JwtUtil** - JWT工具类
   - 支持生成带用户类型的Token
   - 支持从Token中提取用户类型

2. **AdminAuthService** - 管理员认证服务
   - 管理员登录（账号+密码）
   - Token生成和验证
   - 登录信息记录

3. **AdminAuthInterceptor** - 管理员拦截器
   - 拦截所有`/admin/**`路径
   - 验证Token的有效性
   - 验证用户类型为admin

4. **JwtAuthInterceptor** - 普通用户拦截器
   - 拦截除管理员路径外的所有请求
   - 验证普通用户Token

## API接口

### 管理员登录
```
POST /api/admin/auth/login
Content-Type: application/json

{
  "account": "admin",
  "password": "admin123"
}

响应:
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "accessToken": "eyJhbGc...",
    "refreshToken": "eyJhbGc...",
    "expiresIn": 86400,
    "adminInfo": {
      "id": "xxx",
      "account": "admin",
      "username": "系统管理员",
      "role": "super_admin",
      ...
    },
    "loginTime": "2025-10-27 10:00:00"
  }
}
```

### 获取管理员信息
```
GET /api/admin/auth/info
Authorization: Bearer {accessToken}

响应:
{
  "code": 200,
  "message": "操作成功",
  "data": {
    "id": "xxx",
    "account": "admin",
    "username": "系统管理员",
    "role": "super_admin",
    ...
  }
}
```

### 管理员登出
```
POST /api/admin/auth/logout
Authorization: Bearer {accessToken}

响应:
{
  "code": 200,
  "message": "登出成功",
  "data": null
}
```

### 刷新Token
```
POST /api/admin/auth/refreshToken
Content-Type: application/json

{
  "refreshToken": "eyJhbGc..."
}

响应:
{
  "code": 200,
  "message": "令牌刷新成功",
  "data": {
    "accessToken": "eyJhbGc...",
    "refreshToken": "eyJhbGc...",
    "expiresIn": 86400,
    ...
  }
}
```

## 默认管理员账号

系统初始化时会创建一个默认的超级管理员账号：

- **账号**: admin
- **密码**: admin123
- **角色**: super_admin
- **邮箱**: admin@emotion-museum.com
- **手机**: 13800138000

**重要提示**: 生产环境部署后请立即修改默认密码！

## 拦截器配置

### 管理员拦截器
- **拦截路径**: `/admin/**`
- **排除路径**: 
  - `/admin/auth/login` - 登录接口
  - `/admin/auth/refreshToken` - 刷新Token接口
- **优先级**: 1（最高）

### 普通用户拦截器
- **拦截路径**: `/**`
- **排除路径**: 
  - `/auth/**` - 用户认证相关
  - `/admin/**` - 管理员路径（由管理员拦截器处理）
  - `/health` - 健康检查
  - `/ws/**` - WebSocket
  - `/swagger-ui/**` - API文档
- **优先级**: 2

## Token存储

### Redis存储
- **管理员AccessToken**: `admin_token:{adminId}` (24小时)
- **管理员RefreshToken**: `admin_refresh_token:{adminId}` (7天)
- **普通用户Token**: `token:{userId}` (24小时)
- **普通用户RefreshToken**: `refresh_token:{userId}` (7天)

## 安全特性

1. **密码加密**: 使用BCrypt算法加密存储
2. **Token隔离**: 管理员和普通用户Token完全隔离
3. **权限验证**: 管理员接口强制验证userType
4. **登录记录**: 记录最后登录时间、IP和登录次数
5. **状态检查**: 登录时检查账号状态

## 使用示例

### 前端调用示例

```javascript
// 管理员登录
async function adminLogin(account, password) {
  const response = await fetch('/api/admin/auth/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ account, password })
  });
  
  const result = await response.json();
  if (result.code === 200) {
    // 保存Token
    localStorage.setItem('adminToken', result.data.accessToken);
    localStorage.setItem('adminRefreshToken', result.data.refreshToken);
    return result.data;
  }
  throw new Error(result.message);
}

// 调用管理员接口
async function callAdminApi(url, options = {}) {
  const token = localStorage.getItem('adminToken');
  const response = await fetch(url, {
    ...options,
    headers: {
      ...options.headers,
      'Authorization': `Bearer ${token}`
    }
  });
  
  return await response.json();
}
```

## 注意事项

1. **不要混用Token**: 管理员Token只能访问管理员接口，普通用户Token只能访问用户接口
2. **及时刷新Token**: Token过期前使用refreshToken刷新
3. **安全存储**: 前端应安全存储Token，避免XSS攻击
4. **HTTPS**: 生产环境必须使用HTTPS传输
5. **修改默认密码**: 部署后立即修改默认管理员密码

## 扩展功能

后续可以扩展的功能：
- 管理员角色权限细分
- 操作日志记录
- 多因素认证（MFA）
- IP白名单限制
- 登录失败次数限制
