08-安全规范
概述
本规范基于项目现有代码实现,规定了慢病APP后端系统的安全要求和实现标准。所有安全措施必须与现有代码逻辑保持一致,不得引入与当前实现冲突的安全机制。
认证与授权
认证机制
- Token认证:采用基于Token的认证机制,使用UUID生成的32位无符号字符串作为Token。
- Token存储:Token及相关信息存储在数据库
t_user_token表中,每个用户仅维护一个有效Token。
- Token有效期:Token有效期为72小时,过期后自动失效。
- Token刷新:当Token剩余有效期小于24小时时,自动延长至72小时。
- 认证方式:
- 首选:
Authorization: Bearer <token> 标准HTTP头
- 兼容:
X-Token 或 token HTTP头
- 认证拦截:所有API请求(除登录和文档相关路径外)均通过
AuthInterceptor进行Token验证。
实现说明:
TokenServiceImpl.createToken(Long userId) 使用 TokenUtil.generateToken() 生成 token,并将 expireTime 设置为当前时间加 TokenUtil.TOKEN_TTL_HOURS(代码中默认为 72 小时),若用户已有记录则更新 token 与过期时间。
TokenServiceImpl.validateToken(String token) 从 t_user_token 表中根据 token 查询记录,若过期则返回 null;若剩余有效期小于 TokenUtil.REFRESH_THRESHOLD_HOURS(24 小时),会将过期时间延期 TOKEN_TTL_HOURS 并保存。
revokeToken 实现通过将 token 与 expireTime 置空来撤销 token。
授权机制
- 角色权限:基于用户角色进行权限控制,支持以下角色:
- 系统管理员(SYS_ADMIN)
- 医生(DOCTOR)
- 患者(PATIENT)
- 患者家属(PATIENT_FAMILY)
- 角色存储:用户角色信息存储在
t_user_info表的role字段,使用枚举类型PermissionGroup。
登录流程
- 微信登录:通过微信小程序授权码获取openid,结合角色信息完成用户注册/登录。
- Token生成:登录成功后自动生成新的Token,覆盖旧Token。
- 用户绑定:用户通过
role + wx_openid唯一标识。
数据安全
敏感信息存储
- 配置信息:微信小程序的
appid和secret通过WeChatProperties类从配置文件加载。
- 数据库密码:数据库连接密码在
application.yml中明文配置。
- Token信息:Token明文存储在数据库中。
数据传输
- HTTPS配置:项目支持SSL证书配置(
fullchain.pem和privkey.pem),但默认使用HTTP传输。
- CORS配置:允许
http://localhost:3000域名跨域访问,支持Credentials。
输入验证
参数校验
- 框架校验:使用Spring Validation进行参数校验。
- 异常处理:通过
CustomExceptionHandler统一处理校验异常:
BindException:表单绑定校验异常
ConstraintViolationException:约束违反异常
- 错误响应:校验失败时返回统一的错误格式,包含错误码和错误信息。
异常处理
统一异常处理
- 全局处理:使用
@RestControllerAdvice进行全局异常拦截。
- 异常类型:
- 自定义异常(
CustomException)
- 参数校验异常
- 系统未知异常
- 错误信息:异常信息通过统一的
R.fail()格式返回,不暴露系统内部敏感信息。
- 日志记录:系统异常记录详细错误日志。
日志安全
日志配置
- 日志级别:使用SLF4J日志框架,根日志级别为INFO,应用包级别为DEBUG。
- 敏感信息:日志中避免记录Token的完整内容,仅记录前8位字符。
- 认证日志:记录认证成功、失败及Token过期等关键事件。
数据库安全
连接配置
- 连接池:使用HikariCP连接池,配置最小空闲连接5,最大连接20。
- 连接超时:连接超时时间30秒,空闲超时60秒。
- SSL配置:数据库连接默认禁用SSL(
useSSL=false)。
API安全
接口保护
- 路径排除:以下路径不进行Token验证:
/ (首页)
/get_openid (获取openid接口)
/v3/api-docs/** (API文档)
/swagger-ui/** (Swagger UI)
/doc.html (Knife4j文档)
/webjars/** (静态资源)
/favicon.ico
请求处理
- OPTIONS请求:CORS预检请求直接放行,无需认证。
- 用户上下文:认证通过后,将用户ID放入请求属性
currentUserId,供后续业务逻辑使用。
安全配置
Spring Security配置
- 项目未使用Spring Security框架,安全通过自定义拦截器实现。
MyBatis Plus配置
- SQL日志:开发环境开启SQL语句打印,便于调试。
- 字段映射:使用驼峰命名映射数据库字段。
部署安全
证书管理
- SSL证书:支持PEM格式证书文件部署。
- 证书路径:证书文件存储在
classpath:cert/目录下。
监控与审计
安全事件监控
- 认证失败:记录Token缺失、无效或过期的请求。
- 异常监控:记录系统异常,便于安全分析。
合规要求
数据保护
- 个人信息:妥善处理用户微信openid、昵称、头像等个人信息。
- 数据最小化:仅收集必要的数据字段。
访问控制
- 最小权限:用户仅能访问与自己角色相关的功能。
- 会话管理:Token过期后自动失效,防止会话固定攻击。
d:\慢病APP\ChronicDiseaseApp\docs\DevRule\08-安全规范.md