# 员工门户登录超时配置说明

## 问题需求

修改员工门户(hzhub-portal-employee)的登录超时时间为1小时，超时后自动退出。

## 配置原理

### Token超时机制

HZHub使用Sa-Token进行认证管理，token超时时间由 `sys_client` 表的 `active_timeout` 字段控制：

| 字段 | 说明 | 单位 | 默认值 |
|------|------|------|--------|
| `active_timeout` | token活跃超时时间 | 秒 | 1800 (30分钟) |
| `timeout` | token固定超时时间 | 秒 | 604800 (7天) |

**区别说明：**
- **active_timeout**: 用户活跃超时，用户在指定时间内无操作则token失效
- **timeout**: token绝对超时，从登录开始计时，无论是否活跃都将在该时间后失效

### 客户端配置

员工门户使用的客户端ID: `e5cd7e4891bf95d1d19206ce24a7b32e`（来自 .env.development）

## 修改方案

### 方法1：执行SQL更新（推荐）

执行以下SQL脚本将员工门户的超时时间修改为1小时：

```bash
# 连接数据库
mysql -u root -phzhub123

# 执行更新SQL
source /tmp/update_employee_timeout.sql
```

或手动执行SQL：

```sql
-- 查询当前配置
SELECT id, client_id, client_key, active_timeout, timeout, status
FROM sys_client
WHERE client_id = 'e5cd7e4891bf95d1d19206ce24a7b32e';

-- 更新为1小时超时
UPDATE sys_client
SET active_timeout = 3600
WHERE client_id = 'e5cd7e4891bf95d1d19206ce24a7b32e';

-- 验证结果
SELECT id, client_id, client_key, active_timeout, timeout, status
FROM sys_client
WHERE client_id = 'e5cd7e4891bf95d1d19206ce24a7b32e';
```

### 方法2：通过管理后台修改

1. 登录管理后台: http://localhost:5666
2. 进入 "系统管理" -> "客户端管理"
3. 找到 `client_id = e5cd7e4891bf95d1d19206ce24a7b32e` 的记录
4. 编辑该记录，将 `活跃超时时间` 修改为 `3600`
5. 保存

## 超时时间建议

根据不同场景，建议的超时时间配置：

| 场景 | active_timeout | timeout | 说明 |
|------|----------------|---------|------|
| 内部员工 | 3600 (1小时) | 604800 (7天) | 平衡安全性和便利性 |
| 移动端APP | 7200 (2小时) | 604800 (7天) | 移动端使用频率高 |
| 公共终端 | 1800 (30分钟) | 86400 (1天) | 安全性优先 |
| 超级管理员 | 1800 (30分钟) | 86400 (1天) | 高安全性要求 |

## 验证配置生效

修改后需要**重新登录**才能生效：

1. 清除浏览器缓存或使用隐身模式
2. 访问员工门户登录页面
3. 登录后等待1小时不操作
4. 再次访问应自动跳转到登录页面

## 技术实现

### 后端实现

登录时通过 `SaLoginParameter.setActiveTimeout()` 设置：

```java
// PasswordAuthStrategy.java
SaLoginParameter model = new SaLoginParameter();
model.setActiveTimeout(client.getActiveTimeout()); // 从sys_client表读取
LoginHelper.login(loginUser, model);
```

### 前端响应

前端通过以下方式检测token过期：

1. **API响应401**: 拦截器检测到401状态码，自动跳转登录页
2. **路由守卫**: 访问页面时检查token是否有效
3. **本地存储**: Pinia持久化存储token，过期后自动清除

## 相关配置文件

- **后端配置**: `/data/hzhub/hzhub-ai/hzhub-common/hzhub-common-satoken/src/main/resources/common-satoken.yml`
  - `dynamic-active-timeout: true` - 允许动态设置token有效期

- **前端配置**: `/data/hzhub/hzhub-portal-employee/.env.development`
  - `VITE_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e` - 客户端ID

- **数据库表**: `sys_client`
  - `active_timeout` - 活跃超时时间（秒）
  - `timeout` - 固定超时时间（秒）

## 常见问题

### Q: 修改后没有生效？

A: 需要**重新登录**。已登录的token不会立即失效，只有新登录的token才会使用新的超时时间。

### Q: 如何测试超时是否正确？

A:
1. 登录系统
2. 等待设定的超时时间（如1小时）
3. 不进行任何操作
4. 刷新页面或访问API，应自动跳转到登录页

### Q: 可以设置为永不过期吗？

A: 不建议。为了安全考虑，应该设置合理的超时时间。如需延长，可以设置为更大的值：

```sql
-- 设置为8小时
UPDATE sys_client SET active_timeout = 28800 WHERE client_id = 'e5cd7e4891bf95d1d19206ce24a7b32e';

-- 设置为12小时
UPDATE sys_client SET active_timeout = 43200 WHERE client_id = 'e5cd7e4891bf95d1d19206ce24a7b32e';
```

## 相关文档

- [Sa-Token官方文档](https://sa-token.cc/)
- [HZHub认证流程](../docs/architecture/README.md)
- [服务管理脚本](./SERVICE_MANAGEMENT.md)
