# 08-安全规范 ## 概述 本规范基于项目现有代码实现,规定了慢病APP后端系统的安全要求和实现标准。所有安全措施必须与现有代码逻辑保持一致,不得引入与当前实现冲突的安全机制。 ## 认证与授权 ### 认证机制 - **Token认证**:采用基于Token的认证机制,使用UUID生成的32位无符号字符串作为Token。 - **Token存储**:Token及相关信息存储在数据库`t_user_token`表中,每个用户仅维护一个有效Token。 - **Token有效期**:Token有效期为72小时,过期后自动失效。 - **Token刷新**:当Token剩余有效期小于24小时时,自动延长至72小时。 - **认证方式**: - 首选:`Authorization: Bearer ` 标准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