Files
easygoadmin-wiki/EasyGoAdmin_Gin_EleVue/zh/architecture/security.md
T
2026-10-25 17:24:27 +08:00

74 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 4.11 安全架构设计
:::tip 概述
安全能力分布在四个层面:**传输层**(CORS、受信代理)、**认证层**(JWT 双令牌、验证码、限流)、**授权层**(RBAC + 数据权限 + 租户隔离)、**工程层**(fail-fast 校验、演示模式、生产模式红线)。
:::
## 认证:JWT 双令牌
```text
access_token 短时效(默认 2 小时)——常规请求凭证
refresh_token 长时效(默认 7 天)——经 /api/oauth2/token 兑换新令牌
登出/撤销 → Token 黑名单缓存(TTL = 剩余有效期),在线列表同步移除
```
密钥经 `jwt.secret` 配置;**生产模式拒绝默认或过短密钥**。
## 授权:三层收敛
| 层 | 机制 | 粒度 |
|---|---|---|
| 接口 | Authz 按 RouteSpec.Permission 校验 | 动作级(sys:user:add) |
| 按钮 | 前端 v-permission 比对下发权限码 | 组件级 |
| 数据 | DataScope 按 dept_id 收敛 + 租户 Scope | 行级 |
三层同源于菜单-角色授权链,改一处即全局生效。
## 防护
| 防护 | 实现 |
|---|---|
| 暴力破解 | RateLimit:普通接口 120 次/分钟/IP,认证接口 10 次/分钟(更严) |
| 超大请求体 | api.maxBodyMB 上限(默认 10MB) |
| IP 伪造 | 仅受信代理列表(api.proxyIps,支持 CIDR)内的来源才信任 X-Forwarded-For |
| 路径穿越 | 上传文件访问经 SafeJoin 断言物理路径在上传根内;temp 目录封禁 |
| 敏感端点暴露 | api.docs / api.metrics 生产可关闭 |
| 暴力枚举 temp 文件 | temp 临时目录始终 404 |
## 密码与加密
密码哈希经 `utility/crypto` 处理(bcrypt 系),数据库不存明文;前后端传输经 HTTPS(生产由 Nginx 终止 TLS)。
## 生产模式红线(app.prod=true)
启动校验直接拒绝:
1. 默认或过短的 JWT 密钥
2. 非空的验证码万能码(captcha.bypassCode)
3. 未关闭的代码生成器(generator.enable,其具备写服务器源码能力)
## 演示模式(app.demo=true)
写操作一律拒绝、读与登录放行——用于对外演示环境保护数据。
## 审计能力
- 操作日志:谁在何时调了什么接口、入参摘要、结果
- 登录日志:登录行为专项留痕(含 IP 归属地,ip2region 离线库)
- 全链路 trace_id 关联运行日志
## 安全检查清单
生产上线前逐项核对(完整清单见 [11.8 安全加固清单](/zh/deploy/security.html)):
- [ ] app.prod=true 且 JWT 密钥已换
- [ ] generator.enable=false、captcha.bypassCode 为空
- [ ] api.docs=false(或网关封锁)
- [ ] MySQL/Redis 端口仅内网可达(compose 默认仅绑回环)
- [ ] HTTPS 已启用,cors.allowOrigin 收敛到实际域名
- [ ] file.domainUrl 走 https 且 nginx 封禁 temp
## 下一步
→ [4.12 扩展性设计](/zh/architecture/extensibility.html)