1f3c485ceb
角色与授权(交接摘要 §一·三十五): - 权限判定合并两个来源:内置角色按代码(BuiltinRole)、自定义角色按库 (sys_role_permission)。实现放 module 层的 DbRoleGrantSource,security 只依赖 接口 RoleGrantSource —— 否则角色服务要调 permissionChecker,两个包迟早成环 - 权限判定必须加缓存:此前是零 IO,而压测基线是"SQL 条数恒定"。缓存放 Redis, 空结果也缓存(否则已删角色的 token 会把库打穿)、Redis 挂了退化成直读库、TTL 只兜底 - V18 建 sys_role.user_type(账号的 user_type 一直从角色反推,自定义角色不在代码映射里) 与 sys_role_menu;8 个接口 + 错误码 40045;契约 119 -> 129 - 内置角色只读(权限码是前后端契约,做成可改 = 一次误操作就能把管理员锁在系统外); 平台级能力两道防线(界面禁用 + 服务端 40301);防自锁;改完立即生效(写授权清缓存) - RoleProvisioner 从"已存在就 continue"改成幂等回填 + 每日 03:20 定时任务 —— 修的是"代码改了权限、已开通租户永远停在发放那一刻",这种漂移不报错也没测试会红 - scripts/e2e-m10-role.py 77/77 需求收敛(交接摘要 §一·三十六,本节的数字为准): - 删副班主任 / 审核员两个内置角色(6 -> 4)、历史整理器(module/cleanup)、 加入申请(module/join + 学生端 pages/join)、collect_task_org.deputy_user_ids 整列; 审核范围三级回退 -> 两级,连带 6 个 mapper 的 LIKE '%,id,%' 分支 - V19 迁移处理存量:先解 sys_user_role 绑定再软删角色;账号只在"除这两个角色外没有 别的角色"时才软删。必须迁而不能只删代码 —— 角色码删掉后 mergePermissions 返回空集, 存量账号会"能登录、处处 40301",不抛异常不打日志 - 契约 129 -> 119、错误码 59 -> 54、权限码 30 -> 28、PC 菜单 12 -> 10、 小程序页 10 -> 9、原型 32 -> 29 屏、E2E 39 -> 37 个(断言 1695 条) - UserService.list 对不认识的角色码由"静默丢掉过滤条件"改成失败关闭 (之前传个不存在的 roleCode 会返回全校账号,且看起来完全正常) - 品牌元信息同步改名「深学在线」:pom 名称、/doc.html 标题、配置与启动类注释、 存储自检探针内容;学生端 app 名与全局导航栏标题
122 lines
4.0 KiB
YAML
122 lines
4.0 KiB
YAML
# ═══════════════════════════════════════════════════════════
|
||
# 深学在线 · 主配置
|
||
# 环境差异全部放 application-{dev,test,prod}.yml
|
||
# ⚠️ 生产密钥一律走环境变量,不写在这里
|
||
# ═══════════════════════════════════════════════════════════
|
||
server:
|
||
port: 8080
|
||
# 上传接口是长连接,超时要放宽(学生可能从聊天记录选一个 40MB 的文件)
|
||
tomcat:
|
||
connection-timeout: 60s
|
||
max-swallow-size: 100MB
|
||
compression:
|
||
enabled: true
|
||
mime-types: application/json,text/html,text/css,application/javascript
|
||
min-response-size: 2048
|
||
|
||
spring:
|
||
application:
|
||
name: xt-server
|
||
profiles:
|
||
active: dev
|
||
# 额外挂一个 local 配置(backend/application-local.yml,**不提交**)。
|
||
# 用它放云存储密钥这类不该进仓库的东西;文件不存在时是空操作,不影响任何环境。
|
||
#
|
||
# ⚠️ 为什么不用 spring.config.import —— 试过,**优先级不够**:
|
||
# 导入的文件排在 profile 文件之后(优先级更低),于是
|
||
# application-dev.yml 里的 provider 会把它盖掉,表现是
|
||
# "文件明明配了 qiniu,启动后却还是本地磁盘",而且不会有任何报错。
|
||
# profile 文件是后加载的,优先级更高,行为符合直觉。
|
||
include: local
|
||
lifecycle:
|
||
# 优雅停机:等在途请求处理完,避免上传/导出被打断
|
||
timeout-per-shutdown-phase: 30s
|
||
jackson:
|
||
time-zone: Asia/Shanghai
|
||
default-property-inclusion: always
|
||
deserialization:
|
||
fail-on-unknown-properties: false
|
||
servlet:
|
||
multipart:
|
||
max-file-size: 50MB
|
||
max-request-size: 60MB
|
||
datasource:
|
||
driver-class-name: org.postgresql.Driver
|
||
hikari:
|
||
pool-name: xt-hikari
|
||
minimum-idle: 5
|
||
maximum-pool-size: 20
|
||
connection-timeout: 10000
|
||
idle-timeout: 600000
|
||
max-lifetime: 1700000
|
||
# 慢 SQL 从应用侧也记一份,方便和 PG 的 log_min_duration_statement 对照
|
||
leak-detection-threshold: 20000
|
||
data:
|
||
redis:
|
||
timeout: 3s
|
||
lettuce:
|
||
pool:
|
||
max-active: 16
|
||
max-idle: 8
|
||
min-idle: 2
|
||
max-wait: 3s
|
||
flyway:
|
||
enabled: true
|
||
locations: classpath:db/migration
|
||
# 迁移文件一旦发布就不许改,改了校验会失败——这是保护,不是障碍
|
||
validate-on-migrate: true
|
||
baseline-on-migrate: false
|
||
table: flyway_schema_history
|
||
|
||
mybatis-plus:
|
||
configuration:
|
||
map-underscore-to-camel-case: true
|
||
# 生产环境关掉 SQL 日志,dev 单独开
|
||
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
|
||
global-config:
|
||
banner: false
|
||
db-config:
|
||
# 软删除字段名,客户明确要求就叫 deleted
|
||
logic-delete-field: deleted
|
||
logic-delete-value: 1
|
||
logic-not-delete-value: 0
|
||
id-type: auto
|
||
|
||
management:
|
||
endpoints:
|
||
web:
|
||
exposure:
|
||
include: health,info,metrics
|
||
endpoint:
|
||
health:
|
||
show-details: when-authorized
|
||
health:
|
||
redis:
|
||
enabled: true
|
||
|
||
springdoc:
|
||
api-docs:
|
||
path: /v3/api-docs
|
||
swagger-ui:
|
||
path: /doc.html
|
||
tags-sorter: alpha
|
||
operations-sorter: alpha
|
||
|
||
# ── 本项目业务配置 ────────────────────────────
|
||
fill:
|
||
# JWT 见《03-接口设计》§1.2:PC 8 小时 / 小程序 7 天
|
||
jwt:
|
||
issuer: tianbaotong-fill
|
||
pc-expire-seconds: 28800
|
||
mp-expire-seconds: 604800
|
||
# 密钥与 RSA/AES 密钥在 application-{env}.yml 或环境变量中提供
|
||
security:
|
||
# 登录失败锁定:5 次锁 15 分钟(§1.6)
|
||
login-max-fail: 5
|
||
login-lock-minutes: 15
|
||
# 连续失败几次后要求图形验证码
|
||
captcha-after-fails: 2
|
||
upload:
|
||
# 单文件上限 50MB(PRD §10.1)
|
||
max-file-size-mb: 50
|