签入版本
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# 5.7 演示模式
|
||||
|
||||
:::tip 概述
|
||||
演示模式(app.demo)为对外演示站设计:读操作照常、写操作一律拦截。一套配置让演示站可浏览、可登录、但不可篡改数据。
|
||||
:::
|
||||
|
||||
## 工作原理(middleware/demo.go)
|
||||
|
||||
```text
|
||||
app.demo = true 时(中间件链第 4 层):
|
||||
|
||||
放行:
|
||||
* GET / HEAD / OPTIONS(读操作,演示站可浏览)
|
||||
* 公开白名单路径(/api/login、/api/captcha 等,保证演示站可登录)
|
||||
|
||||
拦截:
|
||||
* 其余写操作(POST / PUT / PATCH / DELETE)
|
||||
→ code=1015 "演示环境,禁止操作!"
|
||||
|
||||
app.demo = false(生产默认):中间件直接放行,零开销
|
||||
```
|
||||
|
||||
## 配置
|
||||
|
||||
```yaml
|
||||
app:
|
||||
demo: false # 演示模式:为 true 时写操作一律拒绝,读操作与登录类公开接口放行
|
||||
```
|
||||
|
||||
## 拦截行为细节
|
||||
|
||||
| 请求 | demo=true 行为 |
|
||||
|------|---------------|
|
||||
| GET /api/user/page | ✅ 放行(浏览) |
|
||||
| POST /api/login | ✅ 放行(公开白名单,演示站可登录) |
|
||||
| GET /api/captcha | ✅ 放行(公开白名单) |
|
||||
| POST /api/user/add | ❌ 1015 演示环境,禁止操作! |
|
||||
| PUT /api/user/update | ❌ 1015 |
|
||||
| DELETE /api/user/delete/1 | ❌ 1015 |
|
||||
| POST /api/upload/uploadFile | ❌ 1015 |
|
||||
|
||||
## 设计取舍
|
||||
|
||||
```text
|
||||
为什么按 HTTP 方法而非路径白名单拦截:
|
||||
* 写操作方法(POST/PUT/PATCH/DELETE)与语义严格对应,无遗漏风险
|
||||
* 免维护"哪些写接口可放行"的清单
|
||||
* 登录/验证码是 GET 或公开白名单路径,天然不受影响
|
||||
|
||||
代价:demo 模式下无法演示"新增/编辑"交互——这是有意的取舍,
|
||||
数据安全优先于演示完整性。
|
||||
```
|
||||
|
||||
## 使用建议
|
||||
|
||||
::: warning 环境隔离
|
||||
+ 演示站:`app.demo: true` + 独立数据库 + 独立 jwt.secret
|
||||
+ 本地开发:`app.demo: false`(否则改不动数据还以为是权限问题)
|
||||
+ 生产:`app.demo: false`(发布检查清单项)
|
||||
:::
|
||||
|
||||
## 排障
|
||||
|
||||
| 症状 | 判断 |
|
||||
|------|------|
|
||||
| 写操作全部报"演示环境,禁止操作!" | `app.demo: true`,改回 false 并重启 |
|
||||
| 只有部分写操作被拦 | 不应出现——demo 按方法拦截无差别生效;若出现检查是否 429 限流或 403 权限的干扰 |
|
||||
| 演示站登录后点什么都报 1015 | 正常现象,公开白名单仅覆盖登录链路 |
|
||||
Reference in New Issue
Block a user