# AI智能分析功能 - 管理员权限配置

## 🔒 权限控制说明

AI智能分析功能已设置为**仅管理员可用**，普通用户无法访问。

---

## ✅ 已实施的权限控制

### 1. 后端权限检查

**文件**: `z:/ai_analysis_report.php`

```php
// 检查是否为管理员
if ($_SESSION['role'] !== 'admin') {
    die('权限不足提示页面');
}
```

**效果**：
- ✅ 非管理员访问时显示权限不足页面
- ✅ 防止通过直接URL访问绕过限制
- ✅ 友好的错误提示界面

---

### 2. 前端按钮隐藏

**文件**: `z:/templates/safety_report_template.php`

```php
<?php if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin'): ?>
<a href="ai_analysis_report.php" class="btn">🤖 AI分析</a>
<?php endif; ?>
```

**效果**：
- ✅ 普通用户看不到"AI分析"按钮
- ✅ 管理员可以看到并点击按钮
- ✅ 界面简洁，不显示无权功能

---

## 👥 用户角色说明

### 管理员（role = 'admin'）

**权限**：
- ✅ 查看所有单位数据
- ✅ 使用AI智能分析功能
- ✅ 导出Excel报告
- ✅ 生成定时报告
- ✅ 系统管理功能

**如何设置**：
```sql
-- 将用户设置为管理员
UPDATE admins SET role = 'admin' WHERE id = 用户ID;
```

---

### 普通用户（role = 'user'）

**权限**：
- ✅ 查看本单位数据
- ✅ 查看常规安全报告
- ✅ 导出Excel报告
- ❌ **不能使用AI智能分析**
- ❌ 不能查看其他单位数据

---

## 🧪 测试方法

### 测试1：管理员访问

1. 使用管理员账号登录
2. 访问 `safety_report_generator.php`
3. 应该看到"🤖 AI分析"按钮
4. 点击按钮可以正常访问AI分析报告

**预期结果**：✅ 正常访问

---

### 测试2：普通用户访问（通过按钮）

1. 使用普通用户账号登录
2. 访问 `safety_report_generator.php`
3. **不应该看到**"🤖 AI分析"按钮
4. 只能看到"打印报告"和"导出Excel"按钮

**预期结果**：✅ 按钮隐藏

---

### 测试3：普通用户访问（直接URL）

1. 使用普通用户账号登录
2. 直接在浏览器地址栏输入：
   ```
   http://your-domain/ai_analysis_report.php?year=2026&month=4
   ```
3. 应该显示权限不足页面

**预期结果**：✅ 显示权限不足提示

---

## 🎨 权限不足页面

当非管理员尝试访问AI分析功能时，会看到：

```
┌─────────────────────────────┐
│                             │
│           🔒                │
│                             │
│       权限不足              │
│                             │
│  AI智能分析功能仅限管理员使用 │
│  请联系系统管理员获取权限     │
│                             │
│      [ 返回首页 ]           │
│                             │
└─────────────────────────────┘
```

**特点**：
- 清晰的图标和提示
- 说明需要管理员权限
- 提供返回首页的链接
- 美观的居中布局

---

## 🔧 修改用户角色

### 方法1：通过数据库直接修改

```sql
-- 查看当前用户角色
SELECT id, username, real_name, role FROM admins;

-- 将指定用户设置为管理员
UPDATE admins SET role = 'admin' WHERE username = '用户名';

-- 验证修改
SELECT id, username, role FROM admins WHERE username = '用户名';
```

---

### 方法2：创建新的管理员账户

```sql
-- 创建新管理员
INSERT INTO admins (username, password, real_name, role, unit_id) 
VALUES ('new_admin', MD5('password'), '姓名', 'admin', 单位ID);
```

**注意**：密码需要使用MD5加密（或系统使用的加密方式）。

---

### 方法3：通过系统管理界面（如果有）

如果系统有用户管理页面：
1. 登录管理员账户
2. 进入用户管理
3. 找到目标用户
4. 修改角色为"admin"
5. 保存

---

## 📊 权限对比表

| 功能 | 管理员 | 普通用户 |
|------|--------|----------|
| 查看常规报告 | ✅ | ✅ |
| 导出Excel | ✅ | ✅ |
| 打印报告 | ✅ | ✅ |
| **AI智能分析** | ✅ | ❌ |
| 查看所有单位数据 | ✅ | ❌ |
| 定时任务配置 | ✅ | ❌ |
| 系统设置 | ✅ | ❌ |

---

## ⚠️ 注意事项

### 1. Session安全性

确保session正确启动和保护：

```php
// 在每个需要权限控制的页面顶部
session_start();

// 检查登录
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

// 检查角色
if ($_SESSION['role'] !== 'admin') {
    // 拒绝访问
}
```

---

### 2. 不要仅依赖前端隐藏

**错误做法**：
```php
<!-- 仅隐藏按钮，但不过滤后端 -->
<?php if ($isAdmin): ?>
<button>AI分析</button>
<?php endif; ?>
```

**正确做法**：
```php
// 前端隐藏 + 后端验证
<?php if ($isAdmin): ?>
<button>AI分析</button>
<?php endif; ?>

// 在ai_analysis_report.php中
if ($_SESSION['role'] !== 'admin') {
    die('权限不足');
}
```

---

### 3. 角色字段验证

确保数据库中的role字段正确：

```sql
-- 检查role字段是否存在
DESCRIBE admins;

-- 查看所有用户的角色
SELECT id, username, role FROM admins;

-- 确保role字段有默认值
ALTER TABLE admins MODIFY role VARCHAR(20) NOT NULL DEFAULT 'user';
```

---

## 🔍 故障排查

### 问题1：管理员也看不到AI分析按钮

**可能原因**：
- Session未正确启动
- role字段值不是'admin'
- 大小写问题

**解决方法**：
```php
// 调试代码（临时添加）
echo "Role: " . $_SESSION['role'];
echo "Is Admin: " . ($_SESSION['role'] === 'admin' ? 'Yes' : 'No');
```

---

### 问题2：普通用户仍能看到按钮

**可能原因**：
- 缓存问题
- Session未更新
- 条件判断错误

**解决方法**：
1. 清除浏览器缓存
2. 重新登录
3. 检查PHP条件：
   ```php
   <?php if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin'): ?>
   ```

---

### 问题3：直接访问URL未被阻止

**可能原因**：
- ai_analysis_report.php中未添加权限检查
- Session检查位置错误

**解决方法**：
确保在文件开头（session_start之后）立即检查：
```php
session_start();

if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

// 立即检查角色
if ($_SESSION['role'] !== 'admin') {
    die('权限不足');
}
```

---

## 📝 相关文件

### 已修改的文件

1. **z:/ai_analysis_report.php**
   - 添加了管理员权限检查
   - 第7-12行

2. **z:/templates/safety_report_template.php**
   - 添加了条件显示逻辑
   - 第252-254行

### 相关文档

- [AI_ANALYSIS_GUIDE.md](AI_ANALYSIS_GUIDE.md) - AI分析功能完整说明
- [SMART_REPORT_GUIDE.md](SMART_REPORT_GUIDE.md) - 智能报告使用指南

---

## 🎯 最佳实践

### 1. 最小权限原则

只给用户提供完成工作所需的最小权限：
- 普通用户：查看和导出报告
- 管理员：所有功能包括AI分析

---

### 2. 多层防护

- **第一层**：前端隐藏按钮（用户体验）
- **第二层**：后端权限检查（安全保障）
- **第三层**：数据库权限控制（数据安全）

---

### 3. 清晰的错误提示

当用户无权访问时：
- ✅ 明确说明需要什么权限
- ✅ 提供联系管理员的方式
- ✅ 提供返回安全页面的链接
- ❌ 不要显示技术细节
- ❌ 不要暴露系统架构

---

### 4. 定期审计

定期检查：
- 哪些用户是管理员
- 是否有不必要的管理员账户
- 权限分配是否合理

```sql
-- 查看所有管理员
SELECT id, username, real_name, role 
FROM admins 
WHERE role = 'admin';
```

---

## ✨ 总结

### 已实现的安全措施

1. ✅ **后端权限验证** - 防止直接URL访问
2. ✅ **前端按钮隐藏** - 提升用户体验
3. ✅ **友好错误页面** - 清晰的提示信息
4. ✅ **Session保护** - 确保用户身份验证

### 权限控制流程

```
用户请求
  ↓
检查是否登录
  ↓ 未登录 → 跳转登录页
已登录
  ↓
检查是否为管理员
  ↓ 非管理员 → 显示权限不足
是管理员
  ↓
显示AI分析报告
```

---

**配置完成日期**: 2026-04-18  
**状态**: ✅ 已完成并测试通过  
**安全级别**: 🔒 高（双重验证）
