# Casdoor 集成配置指南

本文档将指导您如何配置 Casdoor 作为项目的登录认证系统。

## 前置条件

1. 已通过 1Panel 部署 Casdoor 服务
2. Casdoor 服务可以正常访问
3. 拥有 Casdoor 管理员权限

## 第一步：在 Casdoor 中创建应用

1. **登录 Casdoor 管理界面**
   - 访问您的 Casdoor 地址（例如：`http://your-server:8000`）
   - 使用管理员账户登录（默认：`admin` / `123`）

2. **创建应用（Application）**
   - 进入 "Applications" 页面
   - 点击 "Add" 按钮创建新应用
   - 填写以下信息：
     - **Name**: 应用名称（例如：`4an-app`）
     - **Display name**: 显示名称（例如：`4AN 工单管理系统`）
     - **Organization**: 选择组织（默认：`built-in`）
     - **Enable password**: 是否启用密码登录（根据需要选择）
     - **Enable sign up**: 是否允许注册（根据需要选择）
   
3. **配置回调 URL（Redirect URI）**
   - 在应用配置中找到 "Redirect URLs" 或 "Redirect URI"
   - 添加您的应用回调地址，例如：
     ```
     http://your-app-server:18061/callback
     ```
   - 如果有多个环境，可以添加多个回调地址

4. **记录应用凭证**
   - 创建应用后，Casdoor 会生成：
     - **Client ID**: 客户端 ID
     - **Client Secret**: 客户端密钥
   - 请妥善保存这些信息，后续配置需要使用

## 第二步：配置项目环境变量

在您的环境变量文件（`.env` 或系统环境变量）中添加以下配置：

```bash
# Casdoor 配置
CASDOOR_ENDPOINT=http://your-casdoor-server:8000
CASDOOR_CLIENT_ID=your_client_id_here
CASDOOR_CLIENT_SECRET=your_client_secret_here
CASDOOR_ORGANIZATION_NAME=built-in
CASDOOR_APPLICATION_NAME=your_app_name
CASDOOR_REDIRECT_URI=http://your-app-server:18061/callback
```

### 配置说明

- `CASDOOR_ENDPOINT`: Casdoor 服务的完整地址（不包含路径）
- `CASDOOR_CLIENT_ID`: 在 Casdoor 中创建应用时获得的 Client ID
- `CASDOOR_CLIENT_SECRET`: 在 Casdoor 中创建应用时获得的 Client Secret
- `CASDOOR_ORGANIZATION_NAME`: 组织名称（默认：`built-in`）
- `CASDOOR_APPLICATION_NAME`: 应用名称（与 Casdoor 中创建的应用名称一致）
- `CASDOOR_REDIRECT_URI`: 回调地址，必须与 Casdoor 应用中配置的 Redirect URI 完全一致

## 第三步：安装依赖

确保已安装所有必要的 Python 依赖：

```bash
pip install -r requirements.txt
```

主要依赖包括：
- `requests`: 用于与 Casdoor API 通信
- `Flask-Login`: 用于会话管理
- 其他项目依赖

## 第四步：在 Casdoor 中创建用户

1. **创建用户**
   - 进入 Casdoor 的 "Users" 页面
   - 点击 "Add" 创建新用户
   - 填写用户信息：
     - **Name**: 用户名（唯一标识）
     - **Display name**: 显示名称
     - **Email**: 邮箱（可选）
     - **Phone**: 手机号（建议填写，用于与本地用户表关联）
     - **Password**: 密码
     - **Organization**: 选择组织

2. **关联用户到应用**
   - 在用户详情页面，确保用户属于正确的组织
   - 用户登录后会自动同步到本地数据库

## 第五步：测试登录

1. **启动应用**
   ```bash
   python app/app.py
   # 或使用 uwsgi/supervisor 启动
   ```

2. **访问登录页面**
   - 访问 `http://your-app-server:18061/login`
   - 您应该看到两个登录选项：
     - "使用 Casdoor 登录" 按钮（如果配置了 Casdoor）
     - 手机号登录表单（备用方案）

3. **测试 Casdoor 登录**
   - 点击 "使用 Casdoor 登录" 按钮
   - 应该重定向到 Casdoor 登录页面
   - 使用 Casdoor 中的用户账户登录
   - 登录成功后应该重定向回应用并自动登录

## 用户信息同步

当用户通过 Casdoor 首次登录时，系统会：

1. 从 Casdoor 获取用户信息
2. 检查本地数据库中是否存在该用户（通过手机号匹配）
3. 如果不存在，创建新用户记录
4. 如果存在，更新用户信息（姓名、支局、角色等）

用户信息映射：
- `phone`: 从 Casdoor 的 `phone` 或 `phoneNumber` 字段获取
- `name`: 从 Casdoor 的 `name` 或 `displayName` 字段获取
- `branch`: 从 Casdoor 的 `affiliation` 字段获取
- `role`: 从 Casdoor 的 `type` 字段获取

## 故障排查

### 问题：点击 Casdoor 登录按钮没有反应或报错

**解决方案**：
1. 检查环境变量是否正确配置
2. 检查 `CASDOOR_ENDPOINT` 是否可以访问
3. 检查 `CASDOOR_CLIENT_ID` 和 `CASDOOR_CLIENT_SECRET` 是否正确
4. 查看应用日志获取详细错误信息

### 问题：登录后回调失败

**解决方案**：
1. 确保 `CASDOOR_REDIRECT_URI` 与 Casdoor 应用中配置的完全一致
2. 检查回调地址是否可以从 Casdoor 服务器访问
3. 检查防火墙和网络配置

### 问题：无法获取用户信息

**解决方案**：
1. 检查 Casdoor 应用配置中的 Scope 是否包含 `openid profile email phone`
2. 检查用户是否有正确的权限
3. 查看应用日志中的详细错误信息

### 问题：用户信息同步失败

**解决方案**：
1. 确保 Casdoor 用户信息中包含手机号（phone）
2. 检查数据库连接是否正常
3. 查看应用日志获取详细错误信息

## 安全建议

1. **保护 Client Secret**
   - 不要将 `CASDOOR_CLIENT_SECRET` 提交到代码仓库
   - 使用环境变量或密钥管理服务存储敏感信息

2. **使用 HTTPS**
   - 生产环境建议使用 HTTPS
   - 更新 `CASDOOR_ENDPOINT` 和 `CASDOOR_REDIRECT_URI` 为 HTTPS 地址

3. **定期更新密码**
   - 定期更新 Casdoor 管理员密码
   - 定期轮换 Client Secret

4. **监控日志**
   - 定期检查应用日志，关注认证失败的情况
   - 设置告警机制

## 更多信息

- Casdoor 官方文档：https://casdoor.org/docs/overview
- Casdoor GitHub：https://github.com/casbin/casdoor

## 注意事项

1. 如果未配置 Casdoor（未设置 `CASDOOR_CLIENT_ID`），系统会自动使用原有的手机号登录方式
2. 两种登录方式可以并存，用户可以选择使用哪种方式登录
3. 用户信息会从 Casdoor 同步到本地数据库，确保数据一致性

