74 lines
2.8 KiB
Markdown
74 lines
2.8 KiB
Markdown
# 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)
|